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 のスイッチに対応しますが、セレクター式の後に記述されます。つまり: selector match {alternatives}。

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

次に、さまざまなデータ型のパターン マッチングを見てみましょう:

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

例の最初のケースは整数値 1 に対応し、2 番目のケースは整数値 1 に対応します。文字列値 two 、2 番目のケースは文字列値 2 に対応し、3 番目のケースは、受信値が整数であるかどうかを判断するために使用される型パターンに対応します。 isInstanceOf を使用して型を判断するよりも、次の方が優れています。パターンマッチングを使用します。 4 番目のケースは、デフォルトの完全一致の代替、つまり、switch のデフォルトと同様に、他に一致が見つからない場合の一致を表します。


ケース クラスを使用する

case キーワードを使用するクラス定義は、ケース クラスであり、パターン マッチング用に最適化されています。

以下はサンプル クラスの簡単な例です:

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 キーワードを使用せずにオブジェクトを構築できます。パターン マッチングの動作;

  • toString、equals、hashCode および copy メソッドの定義が明示的に指定されていない限り、これらのメソッドを生成します。