2009-11-24 1 views
6

Что может быть проще/чистым способом?Идиома для опции Scala при проведении тестов на равенство

val o = Some(4) 
if(o.isDefined) {o.get == 4} else { false } 

Я попытался

o.getOrElse(null) == 4 

но чувствует себя не так, так как в случае IsEmpty, вы в конечном итоге тестирования нуль против другой стороны ... что само по себе может быть пустым. Мне нужно это, если opt определен & & opt.get == что угодно. Я чувствую, что каким-либо способом на выбор должен просто взять функцию, и я мог бы сделать это так:

o.test((x) => x == 4) 

и было бы применить функцию только если o.isDefined.

+1

Точный дубликат: http://stackoverflow.com/questions/1611872/a-better-way-to-test-the-value-of-an-option - который , по сути, является первым «связанным» вопросом, который указан. –

+0

Я не придумал, когда искал. Спасибо, что связали их. – Trenton

ответ

7

Это кажется достаточно чистым для меня:

o.map(4==).getOrElse(false) 

Если вы хотите, вы можете даже добавить неявное преобразование добавить удобный метод для этого:

implicit def richOption[A](o: Option[A]) = new { 
    def test(p: A => Boolean): Boolean = o.map(p).getOrElse(false) 
} 
+0

Какова цель «==» после 4? –

+0

"' 4 == '" - это функция, которая проверяет на равенство с сахаром Scala 4 –

+0

. 4 == рассматривается как анонимная функция одного аргумента в этом случае. Более ясно (но более подробно) может быть: 'o.map (4. ==)' или 'o.map (_ == 4)' или 'o.map (x => x == 4)'. Ключевым моментом здесь является то, что все, что вы передаете в Option.map(), оценивается только по параметрам, отличным от None. – overthink

5

Как об этом:

val o = Some(4) 
o match { 
    case Some(4) => true 
    case _ => false 
} 
2

Следующее кажется мне наиболее интуитивным, если вы не заботитесь о создании объекта выше объявление.

val o = Some(4) 
Some(4) == o 

Другой метод unsuggested

val o = Some(4) 
val Some(x) = o; x==4 // Edit: will not compile of o = None 
+0

Второй метод не учитывает, когда o - None. –

+0

D'oh! Отредактировано для отражения. Благодаря! –

9

Вы также можете использовать:

if (o == Some(4)) //do something 
12

Это самый чистый, самый идиоматических способ сделать это.

val o = Some(4) 
o.contains(4) // true 
o.contains(5) // false 

Существует также версия предикат этого:

val o = Some(4) 
o.exists(_ > 0) // true 
o.exists(_ > 100) // false 

использовать только версию предиката, если contains не является достаточно сильным.

1

Попробуйте это:

val o = Some(4) 
o.exists(4 == _) 
Смежные вопросы