2009-11-24 26 views
6

Bunu yapmanın daha kolay ve daha temiz bir yolu nedir?Eşitlik testleri yaparken Scala'nın Seçeneği için İdiom

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

Ben

o.getOrElse(null) == 4 

denedim ama bu kendisi olabilir null hangi ... isEmpty durumda, diğer tarafta karşı test null adlı sona beri yanlış geliyor. Opt, & & opt.get == neyse tanımlanmışsa ona ihtiyacım var. Sadece bir işlev almalıdır Seçenek bazı yöntemle gibi hissediyorum ve bunu gibi yapabilirdik:

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

ve işlevini yalnızca o.isDefined geçerli olacak.

+1

Tam yinelenen: http://stackoverflow.com/questions/1611872/a-better-way-to-test-the-value-of-an-option - hangi Aslında, listelenen ilk "ilgili" sorudur. –

+0

Aradığımda ben gelmedim. Onları bağladığın için teşekkürler. – Trenton

cevap

7

Bu benim için oldukça temiz görünüyor: İsterseniz

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

, hatta bunun için bir kolaylık yöntemi eklemek için bir örtük dönüştürme ekleyebilirsiniz:

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

4'ten sonra '==' amacı nedir? –

+0

"' 4 == '", 4 –

+0

Scala şekeri ile eşitliği test eden bir işlevdir. 4 == bu durumda bir argümanın anonim işlevi olarak kabul edilir. Daha açık bir şekilde (ancak daha verbosely) olabilir: 'o.map (4 ==.) 'Ya da' o.map (_ == 4) 'ya da' o.map (x => X == 4) '. Burada önemli olan nokta, Option.map() 'a ne geçerseniz, sadece None olmayan seçeneklerde değerlendirilir. – overthink

5

nasıl bu konuda:

Eğer nesne oluşturma overhe umurumda değil eğer
val o = Some(4) 
o match { 
    case Some(4) => true 
    case _ => false 
} 
2

şu, benim için en sezgisel görünüyor reklam.

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

Başka unsuggested yöntem de kullanabilirsiniz

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

İkinci yöntem, o Yok olduğunda hesaplanamaz. –

+0

D'oh! Yansıtmak için düzenlenmiştir. Teşekkürler! –

9

:

if (o == Some(4)) //do something 
1
o.map(_ == 4).getOrElse(false) 
12

Bu bunu yapmak için en temiz, en deyimsel yoludur. contains yeterince güçlü değilse

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

Sadece yüklem sürümünü kullanın:

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

da bunun bir yüklem sürümü var.

1

bu deneyin:

val o = Some(4) 
o.exists(4 == _)