絶対忘れるので書いておく。
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{}
のような感じになる。
リンク
リンク