Pregunta

Quiero crear una clase que tome la matriz de cadenas como un argumento de constructor y tenga valores de opción de línea de comando como miembros vals. Algo como a continuación, pero no entiendo cómo funciona el 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)
}
¿Fue útil?

Solución

Aquí hay alternativas más cortas a la coincidencia de patrones para obtener un booleano:

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

El segundo es probablemente mejor. El campo posValue es una opción (también hay negValue ). El método isDefined de Option te dice si es un Some (x) o None.

Otros consejos

No estoy familiarizado personalmente con Scalax o Bistate en particular, pero solo mirando los scaladocs, parece una disyunción de izquierda a derecha. La biblioteca principal de Scala tiene una mónada muy parecida a esta ( cualquiera de las dos ), así que me sorprende que no solo usaran la estándar.

En esencia, Bistate y O bien son un poco como Option , excepto su " Ninguno -equivalent " ; puede contener un valor. Por ejemplo, si estuviera escribiendo un código usando Cualquiera de los dos , podría hacer algo como esto:

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

Esto imprimiría " Resultado: 2 " ;. En este caso, estamos utilizando O para simular una excepción. Devolvemos una instancia de Left que contiene el valor que queremos, a menos que ese valor no se pueda calcular por alguna razón, en cuyo caso devolvemos un mensaje de error envuelto dentro de una instancia de Right .

Entonces, si quiero asignar un valor booleano variable de si se encuentra el indicador, ¿debo hacer lo siguiente?

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

¿No hay una manera de escribir este caso común con menos código que eso?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top