Scala-パターンマッチング
パターンマッチングは、関数値とクロージャに続いて、Scalaで2番目に広く使用されている機能です。Scalaは、メッセージの処理において、パターンマッチングを強力にサポートします。
パターンマッチには、それぞれがキーワードで始まる一連の選択肢が含まれます case。各選択肢には、pattern および1つ以上 expressions、パターンが一致する場合に評価されます。矢印記号=>は、パターンと式を区切ります。
次のサンプルプログラムを試してください。これは、整数値と照合する方法を示しています。
例
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 classesケース式とのパターンマッチングで使用される特別なクラスです。構文的には、これらは特別な修飾子を持つ標準クラスです。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 定義する必要のあるメソッドがないため、クラスは空になります。