如何使用scalax.io.CommandLineParser?
-
05-07-2019 - |
题
我想创建一个类,它将字符串数组作为构造函数参数,并将命令行选项值作为成员vals。像下面的东西,但我不明白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)
}
解决方案
以下是获得布尔值的模式匹配的较短替代方法:
val opt1 = result(opt1Option).isInstanceOf[Positive[_]]
val opt2 = result(opt2Option).posValue.isDefined
第二个可能更好。字段 posValue 是一个选项(还有 negValue )。 Option中的方法 isDefined 会告诉您它是Some(x)还是None。
其他提示
我个人并不熟悉Scalax或 Bistate
,但只是看看scaladocs,它看起来像是一个左右分离。 Scala的主库有一个非常像这样的monad( Either
),所以我很惊讶他们不只是使用标准的。
本质上, Bistate
和
有点像 Option
,除了它们的“ None
-equivalent” ;可以包含一个值。例如,如果我使用 Either
编写代码,我可能会这样做:
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)
}
这将打印“结果:2
”。在这种情况下,我们使用 Either
来模拟异常。我们返回一个 Left
的实例,其中包含我们想要的值,除非由于某种原因无法计算该值,在这种情况下我们返回一个错误消息,该消息包含在 Right 的实例中代码>
因此,如果我想分配给是否找到标志的变量布尔值,我必须这样做?
val opt1 = result(opt1Option) match {
case Positive(_) => true
case Negative(_) => false
}
没有办法用比这更少的代码编写这种常见情况吗?
不隶属于 StackOverflow