Scala Operators shows a very short example of creating “operator-like” method calls.
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
Last Updated 08/22/2009 at 09:38:37 AM by davecblog comments powered by Disqus
Creative Commons Attribution-Noncommercial-Share Alike 3.0 United States License.