鳩舎

レースしない

Scala の Trait

scala> class M { def m() { println("hello"); } }
defined class M

scala> (new M).m()
hello

scala> trait N { def m() { println("hi"); } }
defined trait N

scala> (new M with N).m()
<console>:10: error: anonymous class $anon inherits conflicting members:
  method m in class M of type ()Unit  and
  method m in trait N of type ()Unit
(Note: this can be resolved by declaring an override in anonymous class $anon.)
              (new M with N).m()

メソッド名が衝突する。 override を指定してやると動く。

scala> (new M with N { override def m = super[N].m }).m()
hi

ちょっとめんどくさい。Ruby の mix-in と trait は別物らしい。けどどこらへんが別物なのかまだいまいちわかってない。

Perl 6 の Role は個人的な感想としては mixin じゃないのというイメージなんだけど、あれも Trait のうちに入るんだろうか。