سؤال

أرغب في إنشاء فئة تأخذ صفيف السلسلة كوسيطة منشئة ولها قيم خيار سطر الأوامر كقيم للأعضاء.شيء من هذا القبيل أدناه، ولكنني لا أفهم كيف يعمل 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
}

وليس هناك طريقة لكتابة هذه الحالة مشتركة مع رمز أقل من ذلك؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top