Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Scala dot syntax (or lack thereof)

Tags:

java

syntax

scala

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?

like image 347
Zack Marrapese Avatar asked Aug 05 '09 13:08

Zack Marrapese


3 Answers

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
like image 81
André Laszlo Avatar answered Sep 26 '22 00:09

André Laszlo


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.

like image 21
Jörn Horstmann Avatar answered Sep 27 '22 00:09

Jörn Horstmann


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

like image 35
Daniel C. Sobral Avatar answered Sep 25 '22 00:09

Daniel C. Sobral