CoffeeScript重新排列方法调用括号,为什么?

时间:2015-07-13 10:16:57

标签: coffeescript

我在CoffeeScript中写过:

expect (@controllerInstance[fn]).toHaveBeenCalled()

并且已编译为:

return expect(this.controllerInstance[fn].toHaveBeenCalled());

为什么重新安排方法调用括号?我怎么能把它编译成我想要的呢?

我需要看到的是:

expect(this.controllerInstance[fn]).toHaveBeenCalled()

1 个答案:

答案 0 :(得分:2)

圆括号在CoffeeScript中有两个用途:

  1. 表达式分组,例如(6 + 11) * 23f (-> 6), (-> 11)
  2. 功能调用,例如f()g('pancakes')
  3. 由于括号在函数调用中有时是可选的,因此存在一些歧义:

    f (expr)
    

    这些括号是否用于以f作为参数调用expr,或者括号是f参数的一部分? CoffeeScript选择后者的解释。

    如果写:

    ,你会看到类似的问题
    f (x) + 1
    

    CoffeeScript将其视为:

    f((x) + 1)
    

    同样,如果你写:

    f (x, y)
    

    你会收到unexpected ,错误; CoffeeScript没有逗号运算符,因此x, y不是有效的表达式。

    您可以通过删除左括号前的空格来消除歧义:

    expect(@controllerInstance[fn]).toHaveBeenCalled()
    

    expect强制CoffeeScript查看@controllerInstance[fn]周围的括号后,删除空格,以便将其视为函数调用括号。