Search on the blog

2018年1月18日木曜日

Scalaのapply、unapplyについて

applyの説明


class Human(val name: String, val age: Int) {
}

object Human {
  def apply(name: String, age:Int) = {
    new Human(name, age)
  }
}

としておくと、以下のようにインスタンスを生成できる。

val h = Human("taro", 20)

コンパニオンオブジェクトのapplyがファクトリメソッドとして使われるので、newと書かなくてもインスタンスを生成できる。

unapplyの説明


class Human(val name: String, val age: Int) {
}

object Human {
  def unapply(h: Human): Option[(String, Int)] = Some((h.name, h.age))
}

としておくと、以下のようにパターンマッチで使える。

val h = new Human("taro", 20)
h match {
  case Human(name, age) => println(s"name=$name, age=$age")
  case _ => println("unknown")
}


ケースクラス

case classを使ってあんなことやこんなことができるのは、実はapply、unapplyが自動生成されていたかららしい。

case class Human(name: String, age: Int) {
}

val h = Human("taro", 20)
h match {
  case Human(name, age) => println(s"name=$name, age=$age")
  case _ => println("unknown")
}