2009-11-24 108 views
6

什麼是更簡單/更乾淨的方式來做到這一點?斯卡拉的成語在做平等測試時的成語

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

我已經試過

o.getOrElse(null) == 4 

但感覺錯了,因爲在的isEmpty情況下,你最終對對方測試空...這可能本身是空的。我需要它是如果選擇定義& & 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 - 這實際上,這是第一個列出的「相關」問題。 – 2009-11-24 23:06:10

+0

我搜索時沒有出現。感謝您鏈接它們。 – Trenton 2009-11-24 23:53:14

回答

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之後'=='的用途是什麼? – 2009-11-24 20:17:39

+0

「'4 ==''」是一個函數,用於測試與斯太拉糖4 – 2009-11-24 20:45:58

+0

相等。在這種情況下,4 ==被視爲一個參數的匿名函數。更清楚(但更加詳細)可能是:'o.map(4。==)'或'o.map(_ == 4)'或'o.map(x => x == 4)'。關鍵點在於,無論您傳遞給Option.map(),只會在非無選項上進行評估。 – overthink 2009-11-24 20:50:28

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時,第二種方法無法解釋。 – 2009-12-07 04:08:00

+0

D'oh!編輯來反映。謝謝! – 2009-12-07 04:21:46

9

您還可以使用:

if (o == Some(4)) //do something 
1
o.map(_ == 4).getOrElse(false) 
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 == _)