代码之家  ›  专栏  ›  技术社区  ›  JtR

如何使用scalax.io.commandlineparser?

  •  3
  • JtR  · 技术社区  · 17 年前

    我想创建一个将字符串数组作为构造函数参数并将命令行选项值作为成员VAL的类。有点像下面,但我不明白这个小酒馆是怎么运作的。

    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)
    }
    
    3 回复  |  直到 17 年前
        1
  •  2
  •   Germán    17 年前

    下面是该模式匹配的较短替代方案,以获得布尔值:

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

    第二个可能更好。田地 POSS值 是一种选择 负值 同样如此。方法 定义的 From选项告诉您它是一些(x)还是没有。

        2
  •  2
  •   Daniel Spiewak    17 年前

    我个人不熟悉scalax或 Bistate 特别是,但只要看看scaladocs,它看起来像是一个左右分离。斯卡拉的主要图书馆有一个像这样的单子( Either ,所以我很惊讶他们不只是使用标准的。

    本质上, 双态 要么 有点像 Option ,除了他们的“ None -“equivalent”可以包含一个值。例如,如果我使用 要么 ,我可能会这样做:

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

    这将打印” Result: 2 “。在这种情况下,我们使用 要么 模拟异常。我们返回的实例 Left 它包含我们想要的值,除非由于某种原因无法计算该值,在这种情况下,我们将返回包装在 Right .

        3
  •  0
  •   JtR    17 年前

    所以,如果我想给变量赋值,布尔值是否找到了标记,我必须这样做,如下所示?

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

    有没有一种方法可以用更少的代码编写这个常见的案例?