tags:

views:

317

answers:

3

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 ^

Can anyone explain to me why this syntax is unacceptable?

Thanks, Zack

+3  A: 

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.

Jörn Horstmann
+12  A: 

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
André Laszlo
Wow, just one more upvote until I get a new badge. Thanks guys, you're very kind :)
André Laszlo
+1  A: 

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 http://stackoverflow.com/questions/1006967/scala-which-characters-can-i-omit or http://stackoverflow.com/questions/1181533/what-are-the-precise-rules-for-when-you-can-omit-parenthesis-dots-braces-fu.

Daniel