ホームページ  >  記事  >  Java  >  scala でのパターン マッチングに関する簡単な説明

scala でのパターン マッチングに関する簡単な説明

不言
不言転載
2018-11-16 15:40:392112ブラウズ

この記事の内容は scala パターン マッチングについての簡単な説明です。必要な方は参考にしていただければ幸いです。

1. scala のパターン マッチング (パターン マッチング)

パターン マッチングは、scala に特有の機能ではありません。 scala になるのを防ぎます。

scala のパターン マッチングはこれに似ています。

e match {
  case Pattern1 => do Something
  case Pattern2 if-clause => do others
  ...
}

変数 e の後に一致とコード ブロックが続き、各ケースが一致する場合と成功した場合に一致する可能性のあるタイプに対応します。とすると、=>以降のコードが実行されます。

より具体的な例を使用して、パターン マッチングがどのように機能するかを確認できます。

case class Player(name: String, score: Int)
def printMessage(player: Player) = player match {
  case Player(_, score) if score > 100000 =>
    println("Get a job, dude!")
  case Player(name, _) =>
    println("Hey, $name, nice to see you again!")
}

これは、他の言語の switch と少し似ていますが、実際には大きく異なります。

Java のスイッチを例に挙げます。Java のスイッチは、基本的な型のマッチングのみを行ってから、いくつかのアクションを実行します。戻り値はありません。

Scala のパターン マッチング一致は、値の一致に加えて、型の一致も行うことができます。

def parseArgument(arg: String) = arg match {
    //匹配值
    case "-h" | "--help" => displayHelp
    case "-v" | "--version" => displayVerion
    case whatever => unknownArgument(whatever)
}
def f(x: Any): String = x match {
    //匹配类型
    case i:Int => "integer: " + i
    case _:Double => "a double"
    case s:String => "I want to say " + s
}

同時に、パターン マッチングには、上記の一致など、Unit を返す戻り値があります。文字列を返すように上記のコードを変更することもできます。

case class Player(name: String, score: Int)
def message(player: Player) = player match {
  case Player(_, score) if score > 100000 =>
    "Get a job, dude!"
  case Player(name, _) =>
    "Hey, $name, nice to see you again!"
}

パターン マッチングの戻り値は、最初に一致したパターンのコード ブロックによって決定されることに注意してください。

2. パターン マッチングを使用する理由

これを見ると、パターン マッチングは if else と似ていませんか?では、なぜパターンマッチングを使用するのでしょうか?

まず、パターン マッチングは本質的にデータ構造を分割する便利な方法を提供することを理解する必要があります。scala を例に挙げると、パターン マッチングは実際には scala のエクストラクターの機能を使用します。クラス内の unapply() メソッド。

trait User {
  def name: String
}
class FreeUser(val name: String) extends User
object FreeUser {
  //提取器
  def unapply(user: FreeUser): Option[String] = Some(user.name)
}
  val user: User = new FreeUser("Daniel")
  user match {
    case FreeUser(name) => println("it match here" + name)
    case _ => println("not me")
  }

パターン マッチングの本質を理解すると、実際のところ、if else はパターン マッチングにおける典型的な使用法にすぎず、それがすべてではないことがわかります。

同時に、パターン マッチングを使用すると、実際には互いに属さない 2 つのものを切り離すことができ、コードのテストも容易になります。たとえば、上記の一致部分のコードを次のように記述できます。

  val user: User = new FreeUser("Daniel")
  //将返回结果存在一个常量中
  val message = user match {
    case FreeUser(name) => "it match here" + name
    case _ => "not me"
  }
  //可以随意使用该常量,实现解耦
  println(message)

これにより、コードの柔軟性が高まり、その後の操作がより便利になります。

読みやすさの観点から見ると、if else コードを多用することは間違いなく見苦しくなりますが、パターン マッチングを使用すると、コードはより単純かつ明確になり、簡潔なコードはさらに読みやすくなります。

以上がscala でのパターン マッチングに関する簡単な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はsegmentfault.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。