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)
}
War es hilfreich?

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?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top