CoffeeScript如何确定函数参数的优先级?

3
假设我们有三个函数:times、plus 和 minus。它们的功能与它们的名称一样。然后我们在 JavaScript 中创建以下行:
times(plus(1,2) ,minus(5,2));

当使用CoffeeScript编写时,它是这样的:
times plus 1,2 , minus 5,2

在编译成JavaScript之后,它变成了:
(function() {
  times(plus(1, 2, minus(5, 2)));
}).call(this);

这不是我们想要的。有没有 CoffeeScript 的方法来解决这个问题,或者我们必须使用括号?谢谢。


6
作为一名数学家,这正是括号最初被发明的原因。 - Blazemonger
3
永远不要在Ruby、CoffeeScript或其他允许省略括号的语言中嵌套不带括号的函数调用。这些语言即使允许省略括号,除了最外层的嵌套函数调用之外,任何地方都不应该省略,否则会导致可怕的错误特性。 - millimoose
@Xi,你可以使用括号。拜托,拜托,拜托,一定要用。并不是因为你在使用CoffeeScript就必须要避免使用括号... - brandizzi
2个回答

9

正如我在我的书中所解释的那样,编译器无法知道您想使用哪个规则来进行隐式括号。当然,在这种情况下

times plus 1,2, minus 5,2

对于人类来说,显然你希望它的意思是什么。

times(plus(1,2), minus(5,2))

但你也可以这样写:
times 5, plus 1, parseInt str, 10

并且期望它被理解(就像它本来的样子)

times(5, plus(1, parseInt(str, 10))

CoffeeScript隐式括号的规则非常简单:它们会放在表达式的末尾。因此,例如,您总是可以将Math.floor放在数学表达式前面。
作为一种样式问题,我通常只省略行中第一个函数调用的括号,从而避免任何潜在的混淆。这意味着我会将您的示例写成:
times plus(1,2), minus(5,2)

不错,对吧?

“我通常只在一行中的第一个函数调用中省略括号,以避免任何潜在的混淆。” - KFL
我希望CoffeeLint能够在参数解释具有歧义时发出警告。 - KFL

6
作为“常规”函数调用括号的替代方案,您可以使用无括号样式进行函数调用,并仅在优先级方面使用括号,例如:
times (plus 1, 2), (minus 5, 2)

当然,这只是个人口味而已;使用times plus(1, 2), minus(5, 2)版本同样完全可行。

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