【问题标题】:Multiline function calls in CoffeescriptCoffeescript 中的多行函数调用
【发布时间】:2011-11-23 20:39:09
【问题描述】:

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

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

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

但是,通常 lambda 函数更复杂,因此将两个函数放在一行中是不切实际的。相反,我想编写两个多行 lambda 函数。但是,我一生都无法弄清楚如何在咖啡脚本中完成此操作-理想情况下,我想将其编写如下,但会引发错误:

foo
    ->
        1
    ,
    ->
        2

我能想到的最好的作品就是超级丑:

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

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

【问题讨论】:

    标签: function lambda coffeescript


    【解决方案1】:

    这就足够了(如果你愿意,你可以缩进第二个 lamda):

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

    给定函数 f:

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

    结果应该是 3 + 4 = 7

    【讨论】:

    • 谢谢-这正是我需要知道的。仅供参考,之前曾尝试过像缩进那样,但事实证明我稍微过时的 Coffeescript 版本有一个错误。我从没想过尝试不缩进的第二个参数,这是违反直觉的,但效果很好,即使在我的旧咖啡脚本中也是如此。
    【解决方案2】:

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

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

    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"
      )
    )
    

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

    【讨论】:

      【解决方案3】:

      如果后面有变量或函数,函数会被隐式调用。这就是为什么

      foo
        ->
          2
        ,
        ->
          3
      

      不会工作; coffeescript 编译器只看到一个变量,然后在下一行出现意外的缩进。显式调用它

      foo(
        ->
          2
      , ->
          3
      )
      

      会起作用的。

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

      foo ->
        2
      , ->
        3
      

      【讨论】:

        猜你喜欢
        • 2011-12-20
        • 2011-12-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-13
        • 1970-01-01
        • 2011-10-22
        • 2013-06-20
        相关资源
        最近更新 更多