Wie scalax.io.CommandLineParser zu benutzen?
-
05-07-2019 - |
Frage
Ich möchte eine Klasse erstellen, die String-Array als Konstruktor-Argument und Befehlszeilenoption Werte als Mitglieder vals hat. So etwas wie unten, aber ich verstehe nicht, wie die Bi-Zustand funktioniert.
import scalax.data._
import scalax.io.CommandLineParser
class TestCLI(arguments: Array[String]) extends CommandLineParser {
private val opt1Option = new Flag("p", "print") with AllowAll
private val opt2Option = new Flag("o", "out") with AllowAll
private val strOption = new StringOption("v", "value") with AllowAll
private val result = parse(arguments)
// true or false
val opt1 = result(opt1Option)
val opt2 = result(opt2Option)
val str = result(strOption)
}
Lösung
Hier sind kürzere Alternativen zu diesem Pattern-Matching eine boolean zu erhalten:
val opt1 = result(opt1Option).isInstanceOf[Positive[_]]
val opt2 = result(opt2Option).posValue.isDefined
Das zweite ist wahrscheinlich besser. Das Feld posValue ist eine Option (es gibt negValue als auch). Die Methode IsDefined aus Option sagen Sie, ob es sich um einen Teil (x) oder Keine.
Andere Tipps
Ich bin nicht persönlich mit Scalax oder Bistate
insbesondere vertraut, sondern nur an dem scaladocs suchen, es sieht aus wie eine Links-Rechts-Disjunktion. Scala Hauptbibliothek hat eine Monade sehr ähnlich wie diese (Either
), also bin ich überrascht, dass sie nicht nur den Standard ein verwendet haben.
Im Wesentlichen Bistate
und Either
sind ein bisschen wie Option
, mit Ausnahme ihrer „None
-Äquivalent“ einen Wert enthalten kann. wenn ich Code Either
schrieben, das tue ich so etwas wie dies könnte zum Beispiel:
def div(a: Int, b: Int) = if (b != 0) Left(a / b) else Right("Divide by zero")
div(4, 2) match {
case Left(x) => println("Result: " + x)
case Right(e) => Println("Error: " + e)
}
Dies würde drucken "Result: 2
". In diesem Fall verwenden wir Either
eine Ausnahme zu simulieren. Wir geben eine Instanz von Left
, die den Wert enthält, stellen wir wollen, es sei denn, dieser Wert kann aus irgendeinem Grund nicht berechnet werden, in diesem Fall werden wir eine Fehlermeldung zurück innerhalb einer Instanz von Right
gewickelt.
Wenn ich also auf variable Booleschen Wert, ob die Flag zuweisen möge gefunden ich habe wie unten zu tun?
val opt1 = result(opt1Option) match {
case Positive(_) => true
case Negative(_) => false
}
Gibt es nicht eine Möglichkeit, diesen gemeinsamen Fall mit weniger Code zu schreiben, als das?