2012-10-11 2 views
1
val flag = false 

if (val data = flag) { 
    println(data) 
} 

if 문 안에 flag을 할당하여 스칼라에서 자동으로 평가할 수 있습니까? 당신이 값을 반환하지 않습니다스칼라는 if 조건 안에 할당합니다.

if ({val data = true; data}) 
    println("data was true") 

할당하는 경우의 몸에서 사용할 수 없지만 대신 그것을 반환 할 수 있도록

+3

왜 그런 코드를 작성하고 싶습니까? 'if'의 본문 안에'data'가 항상'true'가 될 것입니다. 왜'val data'를 원합니까? – Jesper

+0

내 질문 업데이트 – Ryan

+5

아직 성취가 어렵다는 점은 여전히 ​​분명하지 않습니다. 'flag'의 값에'data'를 할당하는 대신에 어쨌든 범위 내에있는 flag를 사용할 수 있습니다. 당신이하고 싶은 것을 분명히하십시오. – drexin

답변

4

예는하지만 범위를 탈출하지 않습니다. 더 나은 것을 좋아하십시오

def test(data: Boolean) { 
    if (data) {/* data in scope */} 
    else  {/* data in scope */}} 
+0

첫 번째 샘플 코드에서'if '블록 전체에'data'를 사용할 수 있습니까? – Ryan

+0

안타깝게도 중괄호 안에 범위 만 있습니다. 할당하고 테스트 한 다음'if'의 본문에서 사용해야하는 경우'var'을 선언해야하는 것처럼 보입니다 (이는 쓰레기 값 지정이 필요합니다) 'if'를 포함하는 외부 범위에서. 'var'를 사용하는 것은'if' 조건 섹션의 범위에서 할당하고, 테스트하고, 사용할 수있는 것보다 더 중요한 사항입니다. –

3

당신의 케이스 및 다른 많은 도움을 줄 수있는 멋진 확장 기능이 있습니다.

implicit class AnyExtensions[A](val x: A) extends AnyVal { 
    def asSatisfying(p: A => Boolean): Option[A] = 
    if (p(x)) Some(x) else None 
} 

가이 범위에 수입 된 데 당신은 귀하의 예제로 다음을 수행 할 수 있습니다 : 당신은 다음과 같은 암시 적 변환으로 구현할 수

flag.asSatisfying(_).foreach(println) 

이에 자세히 설명을 위해 일부를보다 효율적으로 사용하는 경우가 있습니다 this answer.

이 기능의 주된 장점은 매개 변수를 중간에 도입 할 필요가 없으므로 "if-else"논리를 단일 행 식으로 풀 수있는 능력을 제공한다는 것입니다.