Heim  >  Artikel  >  Java  >  Eine kurze Diskussion zum Mustervergleich in Scala

Eine kurze Diskussion zum Mustervergleich in Scala

不言
不言nach vorne
2018-11-16 15:40:392119Durchsuche

Der Inhalt dieses Artikels ist eine kurze Diskussion über den Mustervergleich in Scala. Er hat einen gewissen Referenzwert. Ich hoffe, er wird für Sie hilfreich sein.

1. Scala-Mustervergleich

Man kann sagen, dass der Mustervergleich eine sehr leistungsstarke Sprachfunktion in Scala ist, aber das hindert ihn nicht daran scala. Ein großartiges Werkzeug für die Sprache.

Scalas Mustervergleich ähnelt diesem,

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

wobei auf die Variable e eine Übereinstimmung und ein Codeblock folgen, wobei jeder Fall einem möglichen Übereinstimmungstyp entspricht, wenn er erfolgreich ist , der Code nach => wird ausgeführt.

Wir können ein konkreteres Beispiel verwenden, um zu sehen, wie der Mustervergleich funktioniert:

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!")
}

In anderen Sprachen sieht es ein bisschen ähnlich aus, aber es ist tatsächlich ganz anders.

Nehmen Sie den Java-Schalter als Beispiel. Der Java-Schalter führt nur einige grundlegende Typübereinstimmungen durch und führt dann einige Aktionen aus und hat keinen Rückgabewert.

Der Mustervergleich von Scala ist viel leistungsfähiger. Zusätzlich zum Abgleichen von Werten kann er auch Typen abgleichen.

def parseArgument(arg: String) = arg match {
    //匹配值
    case "-h" | "--help" => displayHelp
    case "-v" | "--version" => displayVerion
    case whatever => unknownArgument(whatever)
}
rrree

Gleichzeitig hat der Mustervergleich einen Rückgabewert, wie zum Beispiel der obige Treffer, der eine Einheit zurückgibt. Wir können den obigen Code auch ändern, um eine Zeichenfolge zurückzugeben:

def f(x: Any): String = x match {
    //匹配类型
    case i:Int => "integer: " + i
    case _:Double => "a double"
    case s:String => "I want to say " + s
}

Es ist erwähnenswert, dass der Rückgabewert des Mustervergleichs durch den Codeblock im ersten übereinstimmenden Muster bestimmt wird.

2. Warum den Mustervergleich verwenden?

Wenn Sie dies sehen, ist der Mustervergleich nicht mit dem vergleichbar. Warum also Mustervergleich verwenden?

Zunächst müssen wir verstehen, dass der Mustervergleich im Wesentlichen eine bequeme Möglichkeit zur Destrukturierung von Datenstrukturen darstellt. Der Mustervergleich wendet tatsächlich die Funktion des Extraktors in Scala an unapply()-Methode in der Klasse.

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!"
}
rrree

Nachdem Sie die Essenz des Mustervergleichs verstanden haben, werden Sie feststellen, dass if else nur eine typische Verwendung beim Mustervergleich ist, aber nicht alles davon.

Gleichzeitig können Sie durch den Mustervergleich zwei Dinge entkoppeln, die nicht wirklich zueinander gehören, und Ihren Code einfacher testen. Beispielsweise können wir den Code für den Match-Teil oben wie folgt schreiben:

trait User {
  def name: String
}
class FreeUser(val name: String) extends User
object FreeUser {
  //提取器
  def unapply(user: FreeUser): Option[String] = Some(user.name)
}

Dies verleiht dem Code mehr Flexibilität und macht weitere Vorgänge komfortabler.

Aus Sicht der Lesbarkeit ist die Verwendung vieler if-else-Codes zweifellos hässlich. Wenn Sie jedoch den Mustervergleich verwenden, wird der Code viel einfacher und klarer und der Code ist einfacher zu lesen .

Das obige ist der detaillierte Inhalt vonEine kurze Diskussion zum Mustervergleich in Scala. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:segmentfault.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen