Coffeescript中的多行函数调用

时间:2011-09-23 17:19:25

标签: function lambda coffeescript

大家好:假设我有一个函数“foo”,它应该接收两个函数作为参数。如果我有两个lambda函数,我可以按如下方式调用“foo”:

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

在这种情况下,“foo”接收两个函数,一个只返回1,另一个返回2.

但是,通常lambda函数更复杂,因此将两个函数放在一行上是不切实际的。相反,我想写两个多行lambda函数。但是,我无法弄清楚如何在coffeescript中实现这一点 - 理想情况下,我想写如下,但它会抛出错误:

foo
    ->
        1
    ,
    ->
        2

我能想出的最好的作品是超级丑陋的:

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

任何Coffeescript大师都能告诉我如何做到这一点,而不会出现错误吗?谢谢!

3 个答案:

答案 0 :(得分:7)

我认为这是匿名函数似乎不是答案的一种情况。它们在很多情况下都是非常实用和惯用的,但即使它们有局限性,如果在极端情况下使用它们也不太可读。

我将在变量中定义两个函数,然后将它们用作参数:

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

但如果你决定使用lambdas会更好,只需在foo参数周围使用括号:

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

这不是因为您使用的是CoffeScript,您应该不惜一切代价避免使用括号:)

答案 1 :(得分:5)

这应该足够了(你可以根据需要缩进第二个lamda):

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

给出函数f:

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

结果应该给3 + 4 = 7

答案 2 :(得分:0)

如果变量或函数跟随它们,则隐式调用函数。这就是为什么

foo
  ->
    2
  ,
  ->
    3

不起作用; coffeescript编译器只看到一个变量,然后在下一行看到意外的缩进。明确地称之为

foo(
  ->
    2
, ->
    3
)

会奏效。

您可以隐式调用具有多个参数的函数,您只需要将逗号与函数调用的开头对齐

foo ->
  2
, ->
  3