CaseClassとパターンマッチング
beginner's guideの「6 Case classes and pattern matching」より。ScalaではCaseClassというのを使ってパターンマッチングができるらしい。
サンプルコードは以下。
- Classにはcaseを付けて宣言します。
- 関数では「def <関数名>(<引数..>):<戻り値の型> = <分岐条件> match { ... }」として、
- 関数の本文の中で「case <型> => <処理>」として、マッチングした場合の処理を書きます。
// Case Class abstract class Animal case class Kitten(name:String, age:int) extends Animal case class Tiger(name:String, age:int) extends Animal case class Lion(name:String, age:int) extends Animal case class Dog(name:String, age:int) extends Animal // Case Class を使うサンプル object CaseClassSample { // Classのパターンマッチングで分岐する関数。 // 引数のanimalの型で分岐する def call( animal:Animal ) : Unit = animal match { case Kitten(name:String, age:int) => // animal が Kitten の場合ここにくる println("kitten :" + name) case Tiger(name:String, age:int) => // animal が Tiger の場合ここにくる println("tiger :" + name) case Lion(name:String, age:int) if (age == 0) => // if でガード条件を付けることもできます。 println("child lion : " + name) case Lion(name:String, age:int) => println("lion : " + name) case _ => // パターンにマッチしない場合ここに来る。 println( "?") } // メイン def main(args: Array[String]):Unit = { call( Kitten("mii", 1) ) // case classではnewは不要らしい。 call( Tiger("tora", 1) ) call( Lion("leo", 0) ) call( Lion("leon", 2) ) call( Dog("poti", 1) ) } }
実行結果です。
kitten :mii tiger :tora child lion : leo lion : leon ?
うーん、分岐できるのはわかったけどいまいち使い道がわかりません・・・。そもそも、関数型の考え方とかメリットがわかってないんだよなー、むー。