【问题标题】:CoffeeScript re-arranges method call parenthesis, why?CoffeeScript 重新排列方法调用括号,为什么?
【发布时间】:2015-07-14 01:09:05
【问题描述】:

我用 CoffeeScript 写了这个:

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

它被编译成这样:

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

为什么重新排列了方法调用括号?我如何让它编译成我想要的?

我需要看到的是:

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

【问题讨论】:

    标签: coffeescript


    【解决方案1】:

    括号在 CoffeeScript 中有两个用途:

    1. 表达式分组,例如(6 + 11) * 23f (-> 6), (-> 11)
    2. 函数调用,例如f()g('pancakes')

    由于在函数调用中括号有时是可选的,因此在以下方面存在一些歧义:

    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] 周围的括号视为函数调用括号。

    【讨论】:

      猜你喜欢
      • 2020-08-17
      • 2021-05-23
      • 2014-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多