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 メソッドの定義が明示的に指定されていない限り、これらのメソッドを生成します。