복붙노트

[SCALA] "반환"과 스칼라에서 "시도 - 캐치 마지막으로"블록 평가

SCALA

"반환"과 스칼라에서 "시도 - 캐치 마지막으로"블록 평가

다음 두 코드는 다른 결과를 생성합니다 :

def x = try{
  true
} finally false

호출 X는 사실 얻는다

def y:Boolean = try{
  return true
} finally {
  return false
}

호출 Y는 거짓 도착

자바와 같은 반환 버전 동작합니다.

개인적으로 나는 스칼라에서 '수익'을 사용하지 않습니다. 그러나 그것의 좋은 스칼라 try-catch-finally 블록의 가치를 평가하는 방법을 알고 있습니다. 감사.

해결법

  1. ==============================

    1.당신은 (그것이 기술적으로 적어도 자바, 예를 금지 그것을 위해 C #으로 허용 되더라도)는 finally 블록에서 return 문이 안된다.

    당신은 (그것이 기술적으로 적어도 자바, 예를 금지 그것을 위해 C #으로 허용 되더라도)는 finally 블록에서 return 문이 안된다.

    스칼라는 finally 블록은 암시 적 반환하고자 항상 소지품 의도 반환 값이 있다면. 그래서 이해되지 않는다.

    그러나 나는 당신이 명시 적으로 그런 식으로 작성하는 경우가 당신을 도울 수 있다고 생각.

  2. ==============================

    2.스칼라 언어 사양에 따르면 :

    스칼라 언어 사양에 따르면 :

    이 문제는 그 사양에 모순이있는 것으로 보인다. '복귀'기능에서 즉시 반환, try 블록에 대한 표준 동작을 오버라이드 (override)에서이 결과를 야기하기 때문에 나는 그렇게 생각한다. 조명 예입니다 :

    def z : Boolean = {
      val foo = try { true } finally { return false }
      true
    }
    

    Z를 호출하면 false를 반환합니다.

  3. from https://stackoverflow.com/questions/8443743/return-and-try-catch-finally-block-evaluation-in-scala by cc-by-sa and MIT license