Scala dot syntax (or lack thereof)

青春壹個敷衍的年華 提交于 2020-01-11 04:42:11

问题


I was going through the wonderful book Programming in Scala when I came across a piece of code that just doesn't make sense to me:

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

Note line 2 and 3:

val this1 = this widen that.width 

It seems like I should be able to replace this with:

val this1 = this.widen that.width

However, when I try to compile this change, it gives the following error:

error: ';' expected but '.' found.
val this1 = this.widen that.width ^

Why is this syntax unacceptable?


回答1:


Line 2 uses the method widen as an operator, instead of using it as a method in the Java way:

val this1 = this.widen(that.width)

The error occurs because you've left out the parentheses, which you can only do when you use a method in operator notation. You can't do this for example:

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

Instead you should write

"a".+ ("b")

Actually you can do this with integers, but that's beyond the scope of this question.

Read more:

  • Chapter 5 section 3 of your book is about the operator notation, at least in the first edition, version 5
  • A Tour of Scala: Operators



回答2:


I haven't tried it but maybe this works: val this1 = this.widen(that.width)

widen is probably a method taking one parameter (plus the this reference), such methods can be used like operators as in your first sample code.




回答3:


When you use a dot you are using dot-style for method invocation. When you don't, you are using operator-style. You can't mix both syntaxes for the very same method invocation, though you can mix the two for different invocations -- such as that.width used as a parameter in the operator style invocation of widen.

Please refer to Which characters can I omit in Scala? or What are the precise rules for when you can omit parenthesis, dots, braces, = (functions), etc.?.



来源:https://stackoverflow.com/questions/1233263/scala-dot-syntax-or-lack-thereof

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!