Scala
備忘録
match

Scalaにおけるcase classのパターンマッチ

コンストラクタパターン

Scalaのmatch式には◯◯パターンと言うものが幾つかありますが、ケースクラスのコンストラクタによるパターンマッチを コンストラクタパターン と言います。

内部的には、ケースクラスにより生成されるコンパニオンオブジェクトの unapply() (extractor/抽出子) を利用しているようです。

深いパターンマッチ

match式で判定される時に、トップレベルのオブジェクトのチェックだけでなく、引数のオブジェクト、更にその内容までチェックしてくれます。

(与えられた引数から友達のボブかを判定する例)

// 友達
case class Friend(name: String, age: Int, languages: List[String])

// 同僚
case class Coworker(name: String, age: Int, skill: String)

object Main extends App {
  def myFriend(f: Any): String = f match {
    case Friend("Bob", 34, List("English", "Japanese")) => "友達のボブです"
    case _ => "この人は知らないな"
  }

  // Friendオブジェクトであり
  // 第一引数が "Bob"
  // 第二引数の年齢が Int 34、
  // 第三引数の言語が List型で引数に "English" "Japanese" 
  // のときだけマッチする
  val bob = Friend("Bob", 34, List("English", "Japanese"))
  println(myFriend(bob)) // 友達のボブです

  // 1つでも違うと、それは友達のボブではない
  val bob_2 = Friend("Bob", 21, List("English", "Japanese"))
  println(myFriend(bob_2)) // この人は知らないな

  // Friendオブジェクトではない時も当然マッチしない
  val suzuki = Coworker("Suzuki", 21, "Programing")
  println(myFriend(suzuki)) // この人は知らないな
}