Betrachten Sie die folgende Scala-Fallklasse:
case class WideLoad(a: String, b: Int, c: Float, d: ActorRef, e: Date)
Der Mustervergleich ermöglicht es mir, ein Feld zu extrahieren und andere zu verwerfen, etwa so:
someVal match {
case WideLoad(_, _, _, d, _) => d ! SomeMessage(...)
}
Was ich tun möchte, und was mehr relevant ist, wenn eine Fallklasse ~20 ungerade Felder hat, ist, nur ein paar Werte in einer Weise zu extrahieren, die nicht die Eingabe von WideLoad(_, _, _, _, _, some, _, _, _, thing, _, _, interesting)
.
Ich hatte gehofft, dass named args hier helfen könnte, obwohl die folgende Syntax nicht funktioniert:
someVal match {
case WideLoad(d = dActor) => dActor ! SomeMessage(...)
// ^---------- does not compile
}
Gibt es hier irgendeine Hoffnung, oder muss ich viele, viele Zeilen abtippen? _, _, _, _
?
EDITAR : Ich verstehe, dass ich Folgendes tun kann case wl @ WideLoad(...whatever...) => wl.d
aber ich frage mich immer noch, ob es eine noch knappere Syntax gibt, die das tut, was ich brauche, ohne dass ich eine zusätzliche val
.
0 Stimmen
Selbst bei 4 oder 5 Feldern machen die vielen Unterstriche das Lesen ziemlich schwierig. Eine Syntax für benannte Parameter würde die Lesbarkeit erheblich verbessern, aber soweit ich weiß, gibt es so etwas noch nicht.
0 Stimmen
Ich hatte den Eindruck, dass lange Parameterlisten im Allgemeinen zu vermeiden sind.
0 Stimmen
Sie meinten case WideLoad (d == dActor)
4 Stimmen
Es gibt ein SIP zu genau diesem Thema: issues.scala-lang.org/browse/SI-6524
0 Stimmen
@JamesMoore In Bezug auf das Thema frage ich mich, ob man sich von der Syntax der Importanweisungen inspirieren lassen kann. Wir haben das
import org.apache.{foo,bar=>bat}
importiert foo und bar und benennt letztere in bat um. Auf dieselbe Weise könnten wircase WideLoad{d=>actorRef} if actorRef == 42 => SomeMessage(...)