Coffeescript中的多行函数调用

Con*_*ski 6 lambda function coffeescript

大家好:假设我有一个函数"foo",它应该接收两个函数作为参数.如果我有两个lambda函数,我可以调用"foo"如下:

foo (-> 1),(-> 2)
Run Code Online (Sandbox Code Playgroud)

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

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

foo
    ->
        1
    ,
    ->
        2
Run Code Online (Sandbox Code Playgroud)

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

foo.apply [
                ->
                        1
        ,
                ->
                        2
        ]
Run Code Online (Sandbox Code Playgroud)

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

bra*_*zzi 8

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

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

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
Run Code Online (Sandbox Code Playgroud)

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

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

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


Ric*_*ard 5

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

f (-> 
    x = 1
    1 + 2 * x),
-> 
    y = 2
    2 * y
Run Code Online (Sandbox Code Playgroud)

给定函数f:

f = (a,b) -> a() + b()
Run Code Online (Sandbox Code Playgroud)

结果应该给3 + 4 = 7