Scala traitの無名クラスmixin

個人開発したアプリの宣伝
目的地が設定できる手帳のような使い心地のTODOアプリを公開しています。
Todo with Location

Todo with Location

  • Yoshiko Ichikawa
  • Productivity
  • Free

スポンサードリンク

絶対忘れるので書いておく。

traitのメソッドのみ使いたい場合、無名クラスにtrait mixinすれば簡単に利用できる。

このように対象のtraitがあった場合、

trait Job { def p(str:String) = {println(str); str} }

ダメなケース。

new Job()

traitそのものはインスタンス化できないので、当然だめ。


無名クラスインスタンスとして利用する

考え方としては、traitをmixinした無名クラスのインスタンスを作成する。という方法。といっても特別なことは何もない。

無名クラスの作成は

new { val name = "string" }

で作成できる。{}の中にクラス定義を記述できる。

Job traitをmixinした無名クラスは、

new Job{}
//res0: Job = $anon$1@1bb1182d

で作成できる。

なので、その場でtraitのメソッドを使用したい場合は、以下のように記述すると実行できたりする。

var name = "SE"
var ret = ""
new Job{ ret =  p(name) } //SE
println(ret) //SE

これは、

new Job{ ret =  p(name) } 
new Job{ ret =  this.p(name) } 

となるので、無名クラスがmixinしたJob traitのメソッドを呼び出しているということ。そして上記のようにクロージャ変数も利用できた。

複数のtraitをmixinした無名クラスは

new Job with otherTrait{}

のような感じになる。