Scala-pattern-matching

提供:Dev Guides
移動先:案内検索

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: " &plus; age &plus; " year, name: " &plus; name &plus; "?")
         }
      }
   }
   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 クラスの本体も空になります!