3

文字列配列をコンストラクター引数として取り、コマンド ライン オプション値をメンバー vals として持つクラスを作成したいと考えています。以下のようなものですが、バイステートの仕組みがわかりません。

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特に詳しくないのですが、scaladocを見ただけで左右分離のように見えます。Scala のメイン ライブラリにはこのような ( ) モナドがあり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

2 番目の方が優れている可能性があります。フィールドposValueはオプションです ( negValueもあります)。Option のisDefinedメソッドは、それが 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 に答える