Another Tour of Scala

ScalaOperators

The Gist

Scala Operators shows a very short example of creating “operator-like” method calls.

My Interpretation

A method that takes one parameter can be used as if it were an operator, which is to say, without a dot or parenthesis.

Suppose you want to use Ruby’s <=> operator as a sorting mechanism.

Since Scala has very liberal rules about what can be in an identifier, you can make a method called <=> and it works just fine. The function we pass to sort function could also be written like so:

(a,b) => a.<=>(b)

A few caveats, however. For some reason, if your method ends in a colon, it is applied to the identifer to its right, not its left.

def :::: (other:Person) = other.age
def foo  (other:Person) = other.age
println(dave :::: rudy) // prints dave’s age
println(dave foo rudy)  // prints rudy’s age

Also, for some reason, if you wish to create a method that looks like an assignment, you must use an underscore:

def age_=(newAge:Int)
foo.age = 45

My Thoughts on this Feature

The colon and underscore stuff is seemingly random. I guess there’s some math mumbo jumbo that says

element :: list # puts element onto the front of list

and so that’s why that’s there. Subtle. As for the _= stuff, I’m at a loss; Ruby seems to be able to handle this more clearly, so it’s anyone’s guess.

Overall though, I guess this is all handy for creating DSLs. Seems odd, though, that we still need parens around expressions in if statements.