كيفية استخدام scalax.io.CommandLineParser؟
-
05-07-2019 - |
سؤال
أرغب في إنشاء فئة تأخذ صفيف السلسلة كوسيطة منشئة ولها قيم خيار سطر الأوامر كقيم للأعضاء.شيء من هذا القبيل أدناه، ولكنني لا أفهم كيف يعمل 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 أيضًا).طريقة ويعرف من الخيار يخبرك ما إذا كان Some(x) أو لا شيء.
نصائح أخرى
وأنا لست على دراية شخصيا مع Scalax أو Bistate
على وجه الخصوص، ولكن مجرد النظر في scaladocs، فإنه يبدو وكأنه انفصال بين اليسار واليمين. المكتبة الرئيسية سكالا لديها الكائن الدقيق الاحادي الخلية الى حد كبير مثل هذا (Either
)، لذلك أنا مندهش أنهم لم مجرد استخدام معيار واحد.
في جوهرها، Bistate
وEither
هي أشبه Option
، إلا بهم "None
ما يعادل" يمكن أن تحتوي على قيمة. على سبيل المثال، إذا كنت تكتب التعليمات البرمجية باستخدام 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
.
وحتى لو كنت تريد تعيين إلى قيمة منطقية متغير ما إذا كان العلم وجدت أن أفعل مثل أدناه؟
val opt1 = result(opt1Option) match {
case Positive(_) => true
case Negative(_) => false
}
وليس هناك طريقة لكتابة هذه الحالة مشتركة مع رمز أقل من ذلك؟