[SCALA] 스칼라에서 "반환"문의 목적?
SCALA스칼라에서 "반환"문의 목적?
스칼라에서 return 문을 제공하는 실제 이유가 있나요? (제외되는 것을 더 "자바 친화적")
해결법
-
==============================
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.그것은 어려운 인 그러한 상황을 수용 또는 방법의 어휘 단부에 수렴하도록 모든 제어 흐름 경로를 정렬하는 번거로운하기 위해 제공된다.
그것은 어려운 인 그러한 상황을 수용 또는 방법의 어휘 단부에 수렴하도록 모든 제어 흐름 경로를 정렬하는 번거로운하기 위해 제공된다.
데이브 그리피스는 수익의 사용을 제거 할 수 있다고 말한다대로, 확실히 사실이지만, 종종 명백한 수익으로 단순히 절단 실행 짧은보다는 이렇게 더를 붙일 수 있습니다.
도주의 그 방법 내에서 정의 될 수 방법이 아닌 기능 (리터럴)에서 반환 반환.
-
==============================
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.일반적으로 I / O 코드를 의미 필수적 스타일 코드를 작성할 때 유용한로 수익을 볼 수 있습니다. 당신이 순수 기능 코드를하고 있다면, 당신은 반환하지 필요성을 할 (그리고 사용해서는 안됩니다). 그러나 기능적인 코드와 함께 당신은 반환을 사용하여 "조기 탈출"할 수 필수적 코드와 동일한 성능을 얻을 게으름을해야 할 수도 있습니다.
일반적으로 I / O 코드를 의미 필수적 스타일 코드를 작성할 때 유용한로 수익을 볼 수 있습니다. 당신이 순수 기능 코드를하고 있다면, 당신은 반환하지 필요성을 할 (그리고 사용해서는 안됩니다). 그러나 기능적인 코드와 함께 당신은 반환을 사용하여 "조기 탈출"할 수 필수적 코드와 동일한 성능을 얻을 게으름을해야 할 수도 있습니다.
from https://stackoverflow.com/questions/3770989/purpose-of-return-statement-in-scala by cc-by-sa and MIT license
'SCALA' 카테고리의 다른 글
[SCALA] 두 RDD [mllib.linalg.Vector]의 첨가 (0) | 2019.11.12 |
---|---|
[SCALA] 어떻게 쌍 RDD에서 최대 값을 찾는 방법은? (0) | 2019.11.12 |
[SCALA] 어떻게 스칼라 스파크에서 엑셀 (XLS, XLSX) 파일에서 Dataframe을 구성하는? (0) | 2019.11.12 |
[SCALA] 스칼라에서 foldLeft를 사용하여 카레 함수에 인수리스트를 적용 (0) | 2019.11.12 |
[SCALA] 어떻게 스칼라 스파크에서 RDD를 정렬하려면? (0) | 2019.11.12 |