2009-11-24 51 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 == _)