scalax.io.CommandLineParserの使用方法
-
05-07-2019 - |
質問
コンストラクター引数として文字列配列を取り、メンバー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)
}
解決
ブールを取得するためのパターンマッチングのより短い代替手段を次に示します。
val opt1 = result(opt1Option).isInstanceOf[Positive[_]]
val opt2 = result(opt2Option).posValue.isDefined
2番目の方法の方がおそらく優れています。フィールド posValue はオプションです( negValue もあります)。 Optionの isDefined メソッドは、それがSome(x)かNoneかを示します。
他のヒント
私は個人的にScalaxや Bistate
に精通していませんが、単にscaladocsを見ると、左右の分離のように見えます。 Scalaのメインライブラリにはこのようなモナド( Either
)があるため、標準のモナドを使用していないことに驚いています。
本質的に、 Bistate
と Either
は Option
に少し似ていますが、" None
-equivalent&quot ;値を含めることができます。たとえば、 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 のインスタンス内にラップされたエラーメッセージを返しますcode>。
したがって、フラグが見つかったかどうかの変数ブール値に割り当てたい場合、以下のようにする必要がありますか?
val opt1 = result(opt1Option) match {
case Positive(_) => true
case Negative(_) => false
}
これより少ないコードでこの一般的なケースを書く方法はありませんか?