Zack Marrapese
Zack Marrapese

Reputation: 12090

Scala dot syntax (or lack thereof)

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?

Upvotes: 9

Views: 2791

Answers (3)

Daniel C. Sobral
Daniel C. Sobral

Reputation: 297185

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.?.

Upvotes: 2

André Laszlo
André Laszlo

Reputation: 15537

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

Upvotes: 17

Jörn Horstmann
Jörn Horstmann

Reputation: 34014

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.

Upvotes: 3

Related Questions