Scala
備忘録
match

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

More than 1 year has passed since last update.


コンストラクタパターン

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)) // この人は知らないな
}