【问题标题】:Coffeescript: invoking function with space before parensCoffeescript:在括号前使用空格调用函数
【发布时间】:2013-06-03 20:29:10
【问题描述】:

当我在括号前调用一个带有空格的函数时,它会给出一个错误,说 unepected ,

sum = (a, b) ->
  a+b
console.log (sum (1, 2))

错误:意外,
console.log (sum (1, 2))

它指向 1 和 2 之间的逗号

为什么会出现这种奇怪的行为?

【问题讨论】:

    标签: function coffeescript parentheses


    【解决方案1】:

    括号在 CoffeeScript 中有多种用途;此处相关的目的是:

    1. 在表达式中分组。
    2. 函数调用。

    函数调用的括号通常是可选的,因此您可以这样说:

    console.log 6, 11
    

    一切都很好。当分组括号和函数调用括号之间存在一些歧义时,就会出现问题。考虑一下:

    f = (n) -> 2*n
    f (1 + 2) + 3
    

    结果如何?如果括号用于分组,那么我们有:

    x = (1 + 2) + 3 #  6
    f x             # 12
    

    但如果括号表示函数调用,那么我们有:

    x = 1 + 2 # 3
    y = f x   # 6
    y + 3     # 9
    

    因此,括号的含义存在一些歧义,表达式的结果取决于如何解决这种歧义。如果函数名和左括号之间有空格:

    f (1 + 2) + 3
    

    然后 CoffeeScript 使用括号进行分组,并填写可选的括号,函数调用如下所示:

    x = (1 + 2) + 3
    f(x)
    

    但是,如果没有任何空格,则将其视为:

    x = (1 + 2)
    f(x) + 3
    

    因此,如果在左括号之前有一个空格,CoffeeScript 会假定它应该填充函数调用的隐含括号;如果没有空格,则括号被视为显式而不是隐式。

    现在我们可以看看您的具体情况:

    console.log (sum (1, 2))
    

    logsum 后面的空格表示括号用于分组,(1, 2) 不是有效的 CoffeeScript 表达式。

    经验法则:如果您想(或需要)使用括号来表示函数调用,则不要在函数名和左括号之间放置任何空格。

    【讨论】:

      【解决方案2】:

      在 CoffeeScript 中,您可以通过两种方式编写函数调用:

      foo(bar) # with parens
      foo bar  # without parens
      

      由于sum(1, 2) 之间有一个空格,因此您正在对sum 进行无括号的函数调用,将(1, 2) 作为第一个参数,相当于:

      bar = (1, 2)
      sum bar
      

      问题在于(1, 2) 不是有效的CoffeeScript 表达式。要传递两个参数,您必须使用以下任一参数:

      sum(1, 2)
      sum 1, 2
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-30
        • 2016-01-01
        • 2019-12-09
        • 2011-09-29
        • 2022-12-19
        • 1970-01-01
        相关资源
        最近更新 更多