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?
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:
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.
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.?.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With