Meine Methodendefinition sieht wie folgt aus
def processLine(tokens: Array[String]) = tokens match { // ...
Angenommen, ich möchte wissen, ob die zweite Zeichenfolge leer ist
case "" == tokens(1) => println("empty")
Kompiliert nicht. Wie mache ich das?
tokens match {}
).Antworten:
Wenn Sie eine Musterübereinstimmung für das Array durchführen möchten, um festzustellen, ob das zweite Element die leere Zeichenfolge ist, können Sie Folgendes tun:
def processLine(tokens: Array[String]) = tokens match { case Array(_, "", _*) => "second is empty" case _ => "default" }
Das
_*
bindet an eine beliebige Anzahl von Elementen, einschließlich keiner. Dies ähnelt der folgenden Übereinstimmung in Listen, die wahrscheinlich besser bekannt ist:def processLine(tokens: List[String]) = tokens match { case _ :: "" :: _ => "second is empty" case _ => "default" }
quelle
tail @ _*
_*
also eine anonyme Variable? Was würde ich tun, wenn ich den Wert dieses Schwanzes innerhalb des Fallblocks drucken möchte? Wenn ich das tue,case a
kann ich esa
innerhalb des Fallblocks verwenden, aber wenn ich es tuecase _
, wird diese Variable innerhalb des Fallblocks unbrauchbar. Kannst du mehr erklären? Ich habe versucht, Array (a, b, c) zu verwenden, aber das passt für Array der Größe 3, nicht für Größe n.Was besonders cool ist, ist, dass Sie einen Alias für die
_*
Dinge verwenden können, die mit so etwas übereinstimmenval lines: List[String] = List("Alice Bob Carol", "Bob Carol", "Carol Diane Alice") lines foreach { line => line split "\\s+" match { case Array(userName, friends@_*) => { /* Process user and his friends */ } } }
quelle
Der Mustervergleich ist möglicherweise nicht die richtige Wahl für Ihr Beispiel. Sie können einfach tun:
if( tokens(1) == "" ) { println("empty") }
Der Mustervergleich eignet sich besser für Fälle wie:
for( t <- tokens ) t match { case "" => println( "Empty" ) case s => println( "Value: " + s ) }
die für jeden Token etwas drucken.
Bearbeiten: Wenn Sie überprüfen möchten, ob ein Token vorhanden ist, bei dem es sich um eine leere Zeichenfolge handelt, können Sie auch Folgendes versuchen:
if( tokens.exists( _ == "" ) ) { println("Found empty token") }
quelle
println
macht Ihren Code prozedural. Ihre offensichtliche Verwirrung ergibt sich aus der Tatsache, dassif
Blöcke in Scala Ausdrücke und keine Aussagen sind (dh sie geben einen Wert zurück und sind daher perfekt funktionsfähig). Die Verwendung einesif
Ausdrucks ist nicht von Natur aus prozedural, sondern ein Mustervergleich.case
Aussage funktioniert so nicht. Das sollte sein:case _ if "" == tokens(1) => println("empty")
quelle
case
Schlüsselwort(_, "", _). Saying
gehofft hat. So etwas wie case _` ist ziemlich langweilig, aber ich denke, es ist alles, was Sie hier tun können. Könnte auch einfach das Matchreturn tokens(1) == ""
abschaffen und sagen :-).