복붙노트

[SCALA] 스칼라에서 "반환"문의 목적?

SCALA

스칼라에서 "반환"문의 목적?

스칼라에서 return 문을 제공하는 실제 이유가 있나요? (제외되는 것을 더 "자바 친화적")

해결법

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

    1.중첩 된 기능을 무시, 반환하지 않고 해당 계산에 반환과 스칼라 계산을 대체하는 것이 가능하다. 이 결과는 "구조화 프로그래밍"의 초기로 돌아갑니다, 그리고 구조화 된 프로그램 정리, 영리 정도라고합니다.

    중첩 된 기능을 무시, 반환하지 않고 해당 계산에 반환과 스칼라 계산을 대체하는 것이 가능하다. 이 결과는 "구조화 프로그래밍"의 초기로 돌아갑니다, 그리고 구조화 된 프로그램 정리, 영리 정도라고합니다.

    중첩 된 기능으로, 상황이 변경됩니다. 스칼라는 깊은 중첩 된 기능의 일련의 내부에 묻혀 "반환"을 배치 할 수 있습니다. 복귀가 실행될 때, 제어는 (이 방법은 실제로 아직 실행 가정 그렇지 않은 경우 예외가 발생)이 반환에서 최 포함하는 방법으로, 중첩 된 모든 기능의 튀어. 스택 풀기 이러한 종류 (중첩 기능없이 가능한 한)를 제외 할 수 있지만, 계산의 기계적 구조 조정을 통해 수행 될 수 없다.

    당신이 실제로 중첩 된 함수 내부에서 반환 할 것입니다 가장 일반적인 이유는 대한-이해 또는 자원 제어 블록 명령형의 탈옥하는 것입니다. (대한-이해 명령형의 몸은 그냥 문처럼 보인다하더라도, 중첩 된 기능으로 변환됩니다.)

    for(i<- 1 to bezillion; j <- i to bezillion+6){
    if(expensiveCalculation(i, j)){
       return otherExpensiveCalculation(i, j)
    }
    
    withExpensiveResource(urlForExpensiveResource){ resource =>
    // do a bunch of stuff
    if(done) return
    //do a bunch of other stuff
    if(reallyDoneThisTime) return
    //final batch of stuff
    }
    
  2. ==============================

    2.그것은 어려운 인 그러한 상황을 수용 또는 방법의 어휘 단부에 수렴하도록 모든 제어 흐름 경로를 정렬하는 번거로운하기 위해 제공된다.

    그것은 어려운 인 그러한 상황을 수용 또는 방법의 어휘 단부에 수렴하도록 모든 제어 흐름 경로를 정렬하는 번거로운하기 위해 제공된다.

    데이브 그리피스는 수익의 사용을 제거 할 수 있다고 말한다대로, 확실히 사실이지만, 종종 명백한 수익으로 단순히 절단 실행 짧은보다는 이렇게 더를 붙일 수 있습니다.

    도주의 그 방법 내에서 정의 될 수 방법이 아닌 기능 (리터럴)에서 반환 반환.

  3. ==============================

    3.다음 예는

    다음 예는

    더 수익이 없기 때문에이 방법은, 제어 흐름에 IF-else 문 많이 있습니다 (즉, 내가, 당신이 그것을 확장하는 상상력을 사용할 수와 함께 제공되는 것입니다). 나는 실제 생활 예에서 이것을 가져다가 (실제로는 이것보다 더 긴) 더미 코드로 그것을 수정 :

    반환 없음 :

     def process(request: Request[RawBuffer]): Result = {
          if (condition1) {
            error()
          } else {
            val condition2 = doSomethingElse()
            if (!condition2) {
              error()
            } else {
              val reply = doAnotherThing()
              if (reply == null) {
                Logger.warn("Receipt is null. Send bad request")
                BadRequest("Coudln't receive receipt")
              } else {
                reply.hede = initializeHede()
                if (reply.hede.isGood) {
                  success()
                } else {
                  error()
                }
              }
            }
          }
      }
    

    수익률 :

      def process(request: Request[RawBuffer]): Result = {
          if (condition1) {
            return error()
          }
    
          val condition2 = doSomethingElse()
          if (!condition2) {
            return error()
          }
    
          val reply = doAnotherThing()
    
          if (reply == null) {
            Logger.warn("Receipt is null. Send bad request")
            return BadRequest("Coudln't receive receipt")
          }
    
          reply.hede = initializeHede()
          if (reply.hede.isGood)
            return success()
    
          return error()
      }
    

    내 눈에, 두 번째는 더 읽기와 첫 번째보다 더 관리 할 수 ​​있습니다. return 문을 사용하지 않는 경우 (물론 형식의 코드) 들여 쓰기의 깊이는 깊고 깊은 간다. 그리고 나는 그것을 좋아하지 않아 :)

  4. ==============================

    4.일반적으로 I / O 코드를 의미 필수적 스타일 코드를 작성할 때 유용한로 수익을 볼 수 있습니다. 당신이 순수 기능 코드를하고 있다면, 당신은 반환하지 필요성을 할 (그리고 사용해서는 안됩니다). 그러나 기능적인 코드와 함께 당신은 반환을 사용하여 "조기 탈출"할 수 필수적 코드와 동일한 성능을 얻을 게으름을해야 할 수도 있습니다.

    일반적으로 I / O 코드를 의미 필수적 스타일 코드를 작성할 때 유용한로 수익을 볼 수 있습니다. 당신이 순수 기능 코드를하고 있다면, 당신은 반환하지 필요성을 할 (그리고 사용해서는 안됩니다). 그러나 기능적인 코드와 함께 당신은 반환을 사용하여 "조기 탈출"할 수 필수적 코드와 동일한 성능을 얻을 게으름을해야 할 수도 있습니다.

  5. from https://stackoverflow.com/questions/3770989/purpose-of-return-statement-in-scala by cc-by-sa and MIT license