Coffeescript:在括号前加空格调用函数

3
当我在括号前加空格调用函数时,会出现错误提示,显示“unexpected ,”。
sum = (a, b) ->
  a+b
console.log (sum (1, 2))

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

这里指的是1和2之间的逗号

为什么会出现奇怪的行为呢?

2个回答

3
在 CoffeeScript 中,您可以使用两种方式编写函数调用:
foo(bar) # with parens
foo bar  # without parens

由于在sum(1, 2)之间有一个空格,所以你正在进行一个非括号函数调用,将(1, 2)作为第一个参数传递给sum,相当于这个:

bar = (1, 2)
sum bar

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

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))
< p > logsum 后面的空格表示括号用于分组,(1, 2) 不是有效的 CoffeeScript 表达式。

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


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