Scala点语法(或缺少)

当我遇到一段对我来说没有意义的代码时,我正在阅读精彩的Scala编程书:

def above(that: Element): Element = { val this1 = this widen that.width val that1 = that widen this.width elem(this1.contents ++ that1.contents) } 

注意第2和第3行:

 val this1 = this widen that.width 

似乎我应该能够用以下内容替换它:

 val this1 = this.widen that.width 

但是,当我尝试编译此更改时,它会给出以下错误:

错误:’;’ 预期,但’。’ 找到。
val this1 = this.widen that.width ^

为什么这种语法不可接受?

第2行使用widen的方法作为运算符,而不是将其用作Java方法中的方法:

 val this1 = this.widen(that.width) 

发生错误的原因是您省略了括号,只有在运算符表示法中使用方法时才能执行此操作。 例如,你不能这样做:

 "a".+ "b" // error: ';' expected but string literal found. 

相反,你应该写

 "a".+ ("b") 

实际上你可以用整数做到这一点,但这超出了这个问题的范围。

阅读更多:

  • 本书第5章第3节是关于运算符表示法,至少在第一版第5版中
  • 斯卡拉之旅:运营商

我没有尝试过,但也许这样val this1 = this.widen(that.width)val this1 = this.widen(that.width)

widen可能是一个采用一个参数的方法(加上this参考),这样的方法可以像第一个示例代码中的运算符一样使用。

当您使用点时,您使用点样式进行方法调用。 如果不这样做,则使用运算符样式。 您不能将两种语法混合在同一个方法调用中,尽管您可以将两者混合用于不同的调用 – 例如在扩展的运算符样式调用中用作参数的.width。

请参阅Scala中可以省略哪些字符? 或者什么时候可以省略括号,点,大括号,=(函数)等的精确规则? 。