Como usar scalax.io.CommandLineParser?
-
05-07-2019 - |
Pergunta
Eu quero criar uma classe que leva matriz de cadeia como um argumento construtor e tem valores de opção de linha de comando como membros vals. Algo como abaixo, mas eu não entendo como o Bistate funciona.
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)
}
Solução
Aqui são alternativas mais curtas para que a correspondência de padrões para obter um boolean:
val opt1 = result(opt1Option).isInstanceOf[Positive[_]]
val opt2 = result(opt2Option).posValue.isDefined
O segundo é provavelmente melhor. O campo posValue é uma opção (há negValue também). O método IsDefined de Opção diz-lhe se é um Alguns (x) ou Nenhum.
Outras dicas
Eu não estou pessoalmente familiarizado com Scalax ou Bistate
em particular, mas apenas olhando para as scaladocs, parece que uma disjunção esquerda-direita. biblioteca principal do Scala tem uma mônada muito parecido com este (Either
), por isso estou surpreso que eles não apenas usar o padrão.
Em essência, Bistate
e Either
são um pouco como Option
, exceto sua "None
-equivalente" pode conter um valor. Por exemplo, se eu estivesse escrevendo código usando Either
, eu poderia fazer algo parecido com isto:
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)
}
Isto imprimir "Result: 2
". Neste caso, estamos usando Either
para simular uma exceção. Voltamos uma instância de Left
que contém o valor que queremos, a menos que esse valor não pode ser calculado por algum motivo, caso em que voltamos uma mensagem de erro embrulhado dentro de uma instância de Right
.
Então, se eu quiser atribuir ao valor booleano variável de saber se a bandeira é encontrado eu tenho que fazer como abaixo?
val opt1 = result(opt1Option) match {
case Positive(_) => true
case Negative(_) => false
}
Não há uma maneira de escrever neste caso comum com menos código do que isso?