Scala-pattern-matching
Scala-パターンマッチング
パターンマッチングは、関数値とクロージャに次いで、Scalaで2番目に広く使用されている機能です。 Scalaは、メッセージの処理において、パターンマッチングの優れたサポートを提供します。
パターンマッチには、キーワード case で始まる一連の選択肢が含まれます。 それぞれの選択肢には*パターン*と1つ以上の*式*が含まれ、パターンが一致した場合に評価されます。 矢印記号⇒は、パターンを式から分離します。
次のサンプルプログラムを試してください。これは、整数値と照合する方法を示しています。
例
object Demo {
def main(args: Array[String]) {
println(matchTest(3))
}
def matchTest(x: Int): String = x match {
case 1 => "one"
case 2 => "two"
case _ => "many"
}
}
上記のプログラムを Demo.scala に保存します。 このプログラムをコンパイルして実行するには、次のコマンドを使用します。
コマンド
\>scalac Demo.scala
\>scala Demo
出力
many
caseステートメントを含むブロックは、整数を文字列にマップする関数を定義します。 matchキーワードは、関数(上記のパターンマッチング関数など)をオブジェクトに適用する便利な方法を提供します。
異なるタイプのパターンに対して値を照合する次のプログラム例を試してください。
例
object Demo {
def main(args: Array[String]) {
println(matchTest("two"))
println(matchTest("test"))
println(matchTest(1))
}
def matchTest(x: Any): Any = x match {
case 1 => "one"
case "two" => 2
case y: Int => "scala.Int"
case _ => "many"
}
}
上記のプログラムを Demo.scala に保存します。 このプログラムをコンパイルして実行するには、次のコマンドを使用します。
コマンド
\>scalac Demo.scala
\>scala Demo
出力
2
many
one
ケースクラスを使用したマッチング
- caseクラス*は、case式とのパターンマッチングで使用される特別なクラスです。 構文的には、これらは特別な修飾子を持つ標準クラスです:ケース。
以下を試してください。これは、ケースクラスを使用した単純なパターンマッチングの例です。
例
object Demo {
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)
}
上記のプログラムを Demo.scala に保存します。 このプログラムをコンパイルして実行するには、次のコマンドを使用します。
コマンド
\>scalac Demo.scala
\>scala Demo
出力
Hi Alice!
Hi Bob!
Age: 32 year, name: Charlie?
caseキーワードを追加すると、コンパイラーは多くの便利な機能を自動的に追加します。 このキーワードは、パターンマッチングにおけるケース式との関連付けを示唆しています。
まず、コンパイラーはコンストラクター引数を不変フィールド(vals)に自動的に変換します。 valキーワードはオプションです。 可変フィールドが必要な場合は、varキーワードを使用します。 したがって、コンストラクター引数リストはより短くなりました。
第二に、コンパイラは、コンストラクタ引数として指定されたフィールドを使用する* equals、hashCode、および *toString メソッドをクラスに自動的に実装します。 したがって、独自のtoString()メソッドは必要なくなりました。
最後に、定義する必要のあるメソッドがないため、 Person クラスの本体も空になります!