¿Cómo usar scalax.io.CommandLineParser?
-
05-07-2019 - |
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)
}
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?