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)
}
Foi útil?

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?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top