3

我想创建一个将字符串数组作为构造函数参数并将命令行选项值作为成员 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)
}
4

3 回答 3

2

我个人并不熟悉 Scalax Bistate,尤其是,但仅查看 scaladocs,它看起来像是左右分离。Scala 的主库有一个非常像这样的 monad ( Either),所以我很惊讶他们不只是使用标准的。

本质上,BistateEither有点像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)
}

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

于 2008-10-30T22:36:04.533 回答
2

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

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

第二个可能更好。posValue字段是一个选项(也有negValue)。方法isDefined from Option 告诉您它是 Some(x) 还是 None。

于 2008-11-04T00:28:39.870 回答
0

因此,如果我想分配是否找到标志的变量布尔值,我必须像下面那样做?

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

有没有办法用更少的代码编写这个常见的案例?

于 2008-11-02T07:55:05.943 回答