2011-09-23 4 views
4

Salut tout le monde: Supposons que j'ai une fonction "foo" qui devrait recevoir deux fonctions en tant que paramètres. Si j'ai deux fonctions lambda, je peux appeler « toto » comme suit:Appels de fonctions multilignes dans Coffeescript

foo (-> 1),(-> 2) 

Dans ce cas, « foo » reçoit deux fonctions, qui retourne juste 1 et un autre qui retourne 2.

Cependant En général, les fonctions lambda sont plus compliquées, donc mettre les deux fonctions sur une seule ligne n'est pas pratique. Au lieu de cela, j'aimerais écrire deux fonctions lambda multilignes. Cependant, je ne peux pas pour la vie de moi comment accomplir cela dans coffeescript- Idéalement, je voudrais écrire comme suit, mais il jette une erreur:

foo 
    -> 
     1 
    , 
    -> 
     2 

Le meilleur que je peux trouver avec qui fonctionne est super laid:

foo.apply [ 
       -> 
         1 
     , 
       -> 
         2 
     ] 

peut-gourou coffeescript me montrer comment je peux le faire, sans avoir une erreur? Merci!

Répondre

4

Cela devrait suffire (vous pouvez mettre en retrait la deuxième lamda si vous voulez):

f (-> 
    x = 1 
    1 + 2 * x), 
-> 
    y = 2 
    2 * y 

compte tenu de la fonction f:

f = (a,b) -> a() + b() 

le résultat devrait donner 3 + 4 = 7

+0

c'est exactement Action de grâce ce que je devais savoir. FYI, l'avait essayé plus tôt comme ça avec l'indentation, mais il s'avère que ma version Coffeescript légèrement démodée avait un bug.Je n'ai jamais pensé à essayer le second paramètre sans indentation, ce qui est contre-intuitif, mais fonctionne très bien, même dans mon ancien café. –

6

Je crois que c'est une situation où les fonctions anonymes ne semblent pas être la réponse. Ils sont très pratiques et idiomatiques dans beaucoup de situations mais ils ont même des limites et peuvent être moins lisibles s'ils sont utilisés dans des situations extrêmes.

Je définirais les deux fonctions dans les variables et les utiliser comme paramètres:

func1 = -> 
    x = 2 
    y = 3 
    z = x+y 
    return z+2*y 

func2 = -> 
    a = "ok" 
    return a + " if you want this way" 

foo func1, func2 

Mais si vous décidez lambdas serait préférable, il suffit d'utiliser les parenthèses autour des paramètres de foo:

foo ((-> 
    x = 2 
    y = 3 
    z = x+y 
    return z+2*y 
),(-> 
    a = "ok" 
    return a + " if you want this way" 
) 
) 

Ce n'est pas parce que vous utilisez CoffeScript que vous devez éviter les parenthèses à tout prix :)

0

Les fonctions sont implicitement appelées si une variable ou la fonction les suit. C'est pourquoi

foo 
    -> 
    2 
    , 
    -> 
    3 

ne fonctionnera pas; le compilateur coffeescript ne voit qu'une variable suivie d'un retrait inattendu sur la ligne suivante. Appel explicite

foo(
    -> 
    2 
, -> 
    3 
) 

fonctionnera.

Vous pouvez implicitement appeler une fonction avec plusieurs paramenters, il vous suffit d'aligner la virgule avec le début de l'appel de fonction

foo -> 
    2 
, -> 
    3 
Questions connexes