KZKY memo

自分用メモ.

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));
}

同じクラスの同じメンバメソッドの呼び出しでも,振る舞いがことなることがわかる.