Scalaでは基本的に演算子ってものがないっぽい。
+とか.とか全部クラスのメソッド。
なのでいろいろフリーダムな感じでメソッド名を定義できる。

class Polygamist(var firstName:String, var lastName:String){
var spouses:List[ScalaPerson] = Nil

def <+(s:ScalaPerson) = {
this.spouses = s :: this.spouses
}
}

前回やったScalaPersonと似ているけど、今度は配偶者(ScalaPerson)をたくさん持てるPolygamist。

んで<+メソッドで配偶者を追加。ひでえなw
ちょっと動かしてみよう。
object TestMain{
def main(args:Array[String]){
val p = new Polygamist("美香", "叶")
p <+ new ScalaPerson("六郎", "岡島")
p <+ new ScalaPerson("ひろし","中村")
p <+ new ScalaPerson("拓哉","木村")
p <+ new ScalaPerson("龍馬", "坂本")

p.spouses.map(println)
}
}

んで実行結果は↓
性:坂本,名:龍馬
性:木村,名:拓哉
性:中村,名:ひろし
性:岡島,名:六郎

なんか組み込みの演算子にしか見えんね。

と、ここまできて感のいい人は気づく。自分は気づかなかった。
scala> val list = List("foo","bar","hoge")
list: List[java.lang.String] = List(foo, bar, hoge)

scala> list(2)
res27: java.lang.String = hoge

この(2)ってのも実はメソッド。applyメソッドっていうらしい。
さっきのPolygamistに、「x番目の旦那」を返すapplyメソッドをつけてみよう。
class Polygamist(var firstName:String, var lastName:String){
var spouses:List[ScalaPerson] = Nil

def <+(s:ScalaPerson) = {
this.spouses = s :: this.spouses
}

def apply(i:Int) = this.spouses(i)
}

object TestMain{
def main(args:Array[String]){
val p = new Polygamist("美香", "叶")
p <+ new ScalaPerson("六郎", "岡島")
p <+ new ScalaPerson("ひろし","中村")
p <+ new ScalaPerson("拓哉","木村")
p <+ new ScalaPerson("龍馬", "坂本")

println("2番目の男は" + p(2))
}
}

実行するとこうなる。
2番目の男は性:中村,名:ひろし

DSLとか作り放題だなーこれ
まあ普通に使う分にはなにがメリットかっていうと、関数として動作するオブジェクトを簡単に作ることができる。そういう関数として動作するオブジェクトのことを、ファンクターっていうらしい。
すごいね。夢が広がるね。