2011-04-30 3 views
9

은, 그것은 단지의 경우 - 다른 표현의 다른 부분에서 작동 :왜 다른 곳에서 일하는 것을 보장하지 않습니까? 나는 <strong>보장</strong> PREDEF를 사용할 때 스칼라

def evenIt(x:Int) = { 
    if(x % 2 == 0) 
      x+1 //return odd on purpose! 
    else{ 
     x + 1 
    } ensuring(_ % 2 == 0) 
} 

//Test it: 
evenIt(3) 
> 4 
evenIt(4) 
> 5 //<--- ensuring does not catch this! 

하지만 "경우 - 다른"는 표현이었다고 생각 스칼라. 그래서 그냥 값을 반환해야합니다 - 보장 차례로 전달되어야합니까?

여기 뭔가 혼란 스럽습니까? 감사.

편집 : 다음과 같이 저자는 그것을 사용 스칼라의 책 프로그래밍 :

private def widen(x: Int) : Element = 
    if(w <= width) 
     this 
    else { 
     val left = elem(' ', (w - width)/2, height) 
     var right = elem(' ', w - width - left.width, height) 
     left beside this beside right 
    } ensuring (w <= _.width 

그가 여기 만 다른 부분에 적용됩니까?

답변

17

예, else가 표현식이지만 대괄호로 묶은 방식 인 경우 if 표현식이 아닌 x+1ensuring 만 적용하면됩니다. 당신이 if을 둘러싼 닫는 중괄호 후 ensuring을 두는 경우에, 당신이 원하는 것을 할 것입니다 :

def evenIt(x:Int) = { 
    if(x % 2 == 0) 
     x + 1 //return odd on purpose! 
    else 
     x + 1 
} ensuring(_ % 2 == 0) 
+1

감사합니다! 나는 그것에 대해 생각하지 않았다. 저자가이 기능을 사용하는 코드를 추가했습니다. 그는 그것을 다른 곳의 부분에 적용합니까? – drozzy

+1

나는 똑같은 문제를 우연히 만났습니다.) 나는 그렇다고 생각합니다. 다른 책에 적용된 책에서, 다른 부분에 대해서만 확대를하게 만듭니다. 하지만 코드의 다른 부분에 다른 보장을 할 수 있습니다. – damluar

관련 문제