大家好:假设我有一个函数“foo”,它应该接收两个函数作为参数。如果我有两个lambda函数,我可以按如下方式调用“foo”:
foo (-> 1),(-> 2)
在这种情况下,“foo”接收两个函数,一个只返回1,另一个返回2.
但是,通常lambda函数更复杂,因此将两个函数放在一行上是不切实际的。相反,我想写两个多行lambda函数。但是,我无法弄清楚如何在coffeescript中实现这一点 - 理想情况下,我想写如下,但它会抛出错误:
foo
->
1
,
->
2
我能想出的最好的作品是超级丑陋的:
foo.apply [
->
1
,
->
2
]
任何Coffeescript大师都能告诉我如何做到这一点,而不会出现错误吗?谢谢!
答案 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