Scalaの便利な機能パターンマッチ、いろいろな場面で使えるけど、普通のクラスとケースクラスで微妙な差異が・・・・
PatternMatch
object PatternMatch {
class A
class B extends A
class C extends A
case class X(name: String) extends A
case class Y(name: String) extends A
def matchNoCaseClass(obj: A): Unit = obj match {
case a: B => println("class B")
case _ => println("other")
}
def matchCaseClass(obj: A): Unit = obj match {
case X(_) => println("class X")
case _ => println("other")
}
def main(args: Array[String]) = {
matchNoCaseClass(new B)
matchNoCaseClass(new C)
matchCaseClass(new X(""))
matchCaseClass(new Y(""))
}
}
実行結果は以下のような感じ。
class B
other
class X
other
普通のクラスだとパターンマッチのcase節にコンストラクタ縛りとかが使えない。そもそも以下の型縛りの書き方もできない。
case B => println("class B") // 文法エラー
case b: B => println("class B") // OK