LoginSignup
1

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-11-25

コンストラクタパターン

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1