Domanda

Voglio creare una classe che accetta array di stringhe come argomento di costruzione e ha valori di opzioni della riga di comando come membri vals. Qualcosa come sotto, ma non capisco come funziona il Bistate.

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)
}
È stato utile?

Soluzione

Qui ci sono alternative più brevi a quella corrispondenza di pattern per ottenere un valore booleano:

val opt1 = result(opt1Option).isInstanceOf[Positive[_]]
val opt2 = result(opt2Option).posValue.isDefined

Il secondo è probabilmente migliore. Il campo posValue è un'opzione (c'è anche negValue ). Il metodo isDefined da Option ti dice se si tratta di Some (x) o None.

Altri suggerimenti

Non conosco personalmente Scalax o Bistate in particolare, ma solo guardando gli scaladoc, sembra una disgiunzione sinistra-destra. La biblioteca principale di Scala ha una monade molto simile a questa ( entrambi ), quindi sono sorpreso che non abbiano usato solo quella standard.

In sostanza, Bistate e entrambi sono un po 'come Option , tranne il loro " None -equivalent " ; può contenere un valore. Ad esempio, se stavo scrivendo il codice usando O , potrei fare qualcosa del genere:

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

Verrà stampato " Risultato: 2 " ;. In questo caso, stiamo usando entrambi per simulare un'eccezione. Restituiamo un'istanza di Left che contiene il valore desiderato, a meno che quel valore non possa essere calcolato per qualche motivo, nel qual caso restituiamo un messaggio di errore racchiuso in un'istanza di Right .

Quindi, se voglio assegnare a un valore booleano variabile se viene trovato un flag, devo fare come di seguito?

val opt1 = result(opt1Option) match {
    case Positive(_) => true
    case Negative(_) => false
}

Non c'è modo di scrivere questo caso comune con meno codice di quello?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top