Scala パターンマッチング

Scalaは強力なパターンマッチングメカニズムを提供し、多くの場合に使用されています。

パターンマッチングには一連の代替オプションが含まれており、それぞれがキーワードcaseで始まります。各代替オプションには、パターンと1つ以上の式が含まれています。矢印記号=>は、パターンと式を区切ります。

次には、整数型の値のパターンマッチング例を挙げます。

実例

object Test {
   def main(args: Array[String]) {
      println(matchTest(3))

   }
   def matchTest(x: Int): String = x match {
      case 1 => "one"
      case 2 => "two"
      case _ => "many"
   }
}

上記のコードを実行した出力結果は次となります。

$ scalac Test.scala 
$ scala Test

many

matchはJavaのswitchに対応しますが、セレクタ式の後に記述されます。つまり、セレクタマッチです。{代替オプション}

match式は、コードが記述された順序で各パターンを試行して計算します。一致するcaseが1つ見つかる限り、残りのcaseは一致し続けません。

次に、さまざまなデータ型のパターンマッチングをご覧ください。

実例

object Test {
   def main(args: Array[String]) {
      println(matchTest("two"))
      println(matchTest("test"))
      println(matchTest(1))
      println(matchTest(6))

   }
   def matchTest(x: Any): Any = x match {
      case 1 => "one"
      case "two" => 2
      case y: Int => "scala.Int"
      case _ => "many"
   }
}

上記のコードを実行した出力結果は次となります。

$ scalac Test.scala 
$ scala Test
2
many
one
scala.Int

実例にある最初のcaseは整数型の値1に対応し、2番目のcaseは文字列の値twoに対応し、3番目のcaseは型モードに対応します。これは、渡された値が整数型であるかどうかを判定するために使用されます。 isInstanceOfによって型を判定することト比べて、パターンマッチングのほうがいいです。4番目のcaseは、デフォルトの完全一致の代替オプションを表します。つまり、他の一致するアイテムが見つかりません。switchのdefaultに似てます。

ケースクラスを使用する

caseキーワードを使用するクラス定義は、パターンマッチング用に最適化された特別なクラスであるケースクラス(case classes)です。

次には、ケースクラスの例を挙げます。

実例

object Test {
   def main(args: Array[String]) {
        val alice = new Person("Alice", 25)
        val bob = new Person("Bob", 32)
        val charlie = new Person("Charlie", 32)
   
    for (person <- List(alice, bob, charlie)) {
        person match {
            case Person("Alice", 25) => println("Hi Alice!")
            case Person("Bob", 32) => println("Hi Bob!")
            case Person(name, age) =>
               println("Age: " + age + " year, name: " + name + "?")
         }
      }
   }
// ケースクラス
   case class Person(name: String, age: Int)
}

上記のコードを実行した出力結果は次となります。

$ scalac Test.scala 
$ scala Test
Hi Alice!
Hi Bob!
Age: 32 year, name: Charlie?

ケースクラスを宣言すると、次のプロセスが自動的に実行されます。

  • varとして明示的に宣言されていない限り、コンストラクタにある各パラメータはvalになりますが、これはお勧めしません。
  • applyメソッドはコンパニオンオブジェクトで提供されるため、newキーワードを使用せずにオブジェクトを構築できます。
  • パターンマッチングを実行できるため、unapplyメソッドを提供します。
  • これらのメソッドの定義が示されていない限り、toString、equals、hashCode、およびcopyメソッドを生成します。
Share

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です