سؤال

كثيرا ما أجد نفسي مع Option[T] لبعض النوع T وترغب في اختبار قيمة الخيار مقابل بعض القيمة. فمثلا:

val opt = Some("oxbow")
if (opt.isDefined && opt.get == "lakes") 
   //do something

الرمز التالي مكافئ ويزيل متطلبات اختبار وجود من قيمة الخيار

if (opt.map(_ == "lakes").getOrElse(false))
 //do something

لكن هذا يبدو أقل قابلية للقراءة بالنسبة لي. الاحتمالات الأخرى هي:

if (opt.filter(_ == "lakes").isDefined)

if (opt.find(_ == "lakes").isDefined) //uses implicit conversion to Iterable

لكنني لا أعتقد أن هؤلاء يعبرون بوضوح عن النية إما التي ستكون أفضل مثل:

if (opt.isDefinedAnd(_ == "lakes"))

هل حصل أي شخص على طريقة أفضل لإجراء هذا الاختبار؟

هل كانت مفيدة؟

المحلول

ماذا عن

if (opt == Some("lakes"))

هذا يعبر عن القصد بوضوح وهو مستقيم للأمام.

نصائح أخرى

لـ Scala 2.11 ، يمكنك استخدام Some(foo).contains(bar)

Walter Chang FTW ، ولكن إليك بديل آخر محرج:

Some(2) exists (_ == 2)
val opt = Some("oxbow")
opt match {
  case Some("lakes") => //Doing something
  case _ => //If it doesn't match
}

يمكنك استخدام التفريغ أيضًا:

for {val v <- opt if v == "lakes"}
  // do smth with v

أعتقد أنه يمكن أيضًا استخدام مطابقة الأنماط. بهذه الطريقة تقوم باستخراج القيمة المثيرة للاهتمام مباشرة:

val opt = Some("oxbow")
opt match {
  case Some(value) => println(value) //Doing something
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top