コンストラクタパターン
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)) // この人は知らないな
}