Coffeescript中的多行函数调用

6

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

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

在这种情况下,“foo”接收两个函数,一个只返回1,另一个返回2。
然而,通常lambda函数更加复杂,因此在一行上放置两个函数是不切实际的。相反,我想编写两个多行lambda函数。但是,我无论如何都想不出如何在Coffeescript中实现这一点-理想情况下,我希望按照以下方式编写它,但它会抛出错误:
foo
    ->
        1
    ,
    ->
        2

我能想到的最好的方案是非常丑陋的:

我能想到的最好的方案是非常丑陋的:

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

有没有任何Coffeescript专家能够向我展示如何做到这一点,而不会出现错误?谢谢!

3个回答

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

但如果你决定使用Lambda表达式更为合适,只需在foo参数周围使用括号:

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

使用CoffeeScript并不意味着您应该不惜一切代价避免使用括号 :)


5
这应该足够了(如果您愿意,可以缩进第二个 lamda):
f (-> 
    x = 1
    1 + 2 * x),
-> 
    y = 2
    2 * y

给定函数f:

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

结果应该为3 + 4 = 7。

谢谢 - 这正是我需要知道的。顺便说一下,我之前尝试过这样缩进的方式,但结果我的稍微过时的Coffeescript版本有一个错误。我从未想过尝试不带缩进的第二个参数,这是违反直觉的,但非常有效,即使在我的旧版coffeescript中也是如此。 - Conrad Barski

1

如果在函数后面跟着一个变量或函数,那么函数会被隐式调用。这就是为什么。

foo
  ->
    2
  ,
  ->
    3

无法工作;coffeescript编译器只看到一个变量,然后在下一行看到了意外的缩进。需要显式地调用它。

foo(
  ->
    2
, ->
    3
)

会起作用。

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

foo ->
  2
, ->
  3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接