Scala: メソッドの関数リテラル化
クラスの中で同じ名前のメソッドを使うが,振る舞いを切り替えたい場合がある.
例えば,文字列によって,同じメソッド名でも振る舞いを違くしたい.
もっと具体的にいうと,update_alphaをいうメソッドを呼ぶが,変数ver: Stringに指定されているver, ver1: String, ver2: Stringなど,によって振る舞いが異なる場合.
普通に考えればリフレクションだが,メソッドを関数リテラルにすれば解決.
コード
package edu.kzk.function class A(ver: String) { def addDoubly(a: Int, b: Int): Int = { return (a + b) * 2 }; def addTriply(a: Int, b: Int): Int = { return (a + b) * 3 }; var add = { ver match { case "ver1" => addDoubly _; case "ver2" => addTriply _; case _ => (a: Int, b: Int) => { a + b }: Int } } } object MethodToLiteral extends App { val a = new A("ver1"); println(a.add(10, 20)); val b = new A("ver2"); println(b.add(10, 20)); }
同じクラスの同じメンバメソッドの呼び出しでも,振る舞いがことなることがわかる.