2009-11-24 3 views
6

이 작업을 쉽게 수행 할 수있는 방법이 무엇인가요?평등 테스트를 수행 할 때 스칼라 옵션의 관용구

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

나는

o.getOrElse(null) == 4 

을 시도했지만 그 자체가 수하는 null의 경우도있는 ... IsEmpty 함수의 경우에, 당신은 다른 측면에 대한 테스트는 null를 끝낼 때문에, 잘못 느낀다. 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 =='"는 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가 없음 일 때 계정을 계산하지 못합니다. –

+0

D' oh! 반영하도록 편집 됨. 감사! –

9

:

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

이 그것을 할 수있는 깨끗한, 가장 관용적 인 방법입니다. contains가 충분히 강하지 않은 경우

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

만 술어 버전을 사용

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

또한이의 술어 버전이 있습니다.

1

이 시도 :

val o = Some(4) 
o.exists(4 == _) 
관련 문제