[SCALA] 스칼라로 돌아 가기
SCALA스칼라로 돌아 가기
나는 초보자 스칼라 프로그래머이고 이상한 행동을 가로 질러왔다.
def balanceMain(elem: List[Char]): Boolean =
{
if (elem.isEmpty)
if (count == 0)
true;
else false;
if (elem.head == '(')
balanceMain(elem.tail, open, count + 1);....
기본적으로 위의 나는 elem.isEmpty 경우 true를 반환하고 == 0 그렇지 않으면, 내가 false를 반환하려는 계산합니다.
이제 위의 나는 스칼라에서 return 문을 추가 할 필요가 없다는 것을 읽었습니다. 그래서 위의 수익을 생략했다. 그러나 부울을 반환하지 않습니다. 나는 진정한 수익으로 반환 문을 추가합니다. 그것은 완벽하게 작동합니다. 왜 그래야만하지?
또한, 왜 스칼라 반환 문을 가지고 나쁜 연습 간주됩니다
해결법
-
==============================
1.그냥 반환 키워드를 생략만큼 간단하지. 어떤 반환 한 후이없는 경우 스칼라에서 마지막 표현은 반환 값으로 촬영됩니다. 마지막으로 식을 반환 할 것입니다 경우에 따라서, 당신은 반환 키워드를 생략 할 수 있습니다. 당신이 반환하고자하는 마지막 표현이 아닌 경우, 그때 스칼라 당신이 그것을 반환하고 싶다고 알 수 없습니다.
그냥 반환 키워드를 생략만큼 간단하지. 어떤 반환 한 후이없는 경우 스칼라에서 마지막 표현은 반환 값으로 촬영됩니다. 마지막으로 식을 반환 할 것입니다 경우에 따라서, 당신은 반환 키워드를 생략 할 수 있습니다. 당신이 반환하고자하는 마지막 표현이 아닌 경우, 그때 스칼라 당신이 그것을 반환하고 싶다고 알 수 없습니다.
예 :
def f() = { if (something) "A" else "B" }
여기서, 함수 f의 마지막 식 문자열로 계산되는 경우 / 다른 표현이다. 문자열 : 표시가 명시 적으로 반환이 없기 때문에, 스칼라는이 경우 / 다른 식의 결과를 반환하고 싶다고 추정됩니다.
이제, 우리는 경우 / 다른 표현 후 뭔가를 추가하는 경우 :
def f() = { if (something) "A" else "B" if (somethingElse) 1 else 2 }
이제 마지막 표현은 int로 평가하는 경우 / 다른 표현이다. 그래서 F의 반환 형식이 Int 인 것입니다. 우리가 정말 문자열을 반환하고 싶었다면 스칼라가 우리가 의도하다는 아무 생각이 없기 때문에, 우리는 문제에있어. 따라서, 우리는 가변 할 문자열을 저장 및 / 다른 식 않거나 문자열 부분 마지막 발생되도록 순서를 변경하여 두 번째 이후에 반환하거나하여 고정한다.
마지막으로, 우리는 심지어 당신처럼 중첩 된 경우 - 다른 식을 반환 키워드를 피할 수 있습니다 :
def f() = { if(somethingFirst) { if (something) // Last expression of `if` returns a String "A" else "B" } else { if (somethingElse) 1 else 2 "C" // Last expression of `else` returns a String }
}
-
==============================
2.지금까지 답변에 설명 된대로이 항목은 실제로는 조금 더 복잡하다. 롭 노리스의이 블로그 게시물보다 상세하게 설명하고 실제로 (또는 적어도 비 명백한 영향을) 코드를 중단합니다 반환을 사용하는 경우에 대한 예제를 제공합니다.
지금까지 답변에 설명 된대로이 항목은 실제로는 조금 더 복잡하다. 롭 노리스의이 블로그 게시물보다 상세하게 설명하고 실제로 (또는 적어도 비 명백한 영향을) 코드를 중단합니다 반환을 사용하는 경우에 대한 예제를 제공합니다.
이 시점에서 내가 그냥 게시물의 본질을 인용 할 수 있습니다. 가장 중요한 문은 처음에 권리입니다. 포스터로이 인쇄하고 벽 :-)에 넣어
당신이 함수를 인라인 때, 실제로 뭔가를 나누기 하나의 예를 제공합니다
// Inline add and addR def sum(ns: Int*): Int = ns.foldLeft(0)((n, m) => n + m) // inlined add scala> sum(33, 42, 99) res2: Int = 174 // alright def sumR(ns: Int*): Int = ns.foldLeft(0)((n, m) => return n + m) // inlined addR scala> sumR(33, 42, 99) res3: Int = 33 // um.
때문에
이것은 단지 링크 된 게시물에 주어진 예제 중 하나이며 이해하기 쉬운입니다. 이 더있어, 내가보기 엔 거기에 가고, 당신을 격려 읽고 이해합니다.
자바와 같은 명령형 언어에서 올 때, 이것은 처음에는 이상하게 보일 수도 있지만,이 스타일에 익숙해지면 그것은 이해가됩니다. 나에게 또 다른 견적 닫습니다 보자 :
-
==============================
3.나는 스칼라 프로그램 모르겠지만, 암시 적 반환 (루비)와 다른 언어를 사용합니다. 당신은 당신의 경우 (elem.isEmpty) 블록 후 코드를 - 코드의 마지막 줄은 당신이 기대하고 무엇을받지 못하고있는 이유입니다 반환 무슨이다.
나는 스칼라 프로그램 모르겠지만, 암시 적 반환 (루비)와 다른 언어를 사용합니다. 당신은 당신의 경우 (elem.isEmpty) 블록 후 코드를 - 코드의 마지막 줄은 당신이 기대하고 무엇을받지 못하고있는 이유입니다 반환 무슨이다.
편집 : 여기에 너무 함수를 작성하는 간단한 방법입니다. 그냥 IsEmpty 함수의 부울 값을 사용하여 자동으로 true 또는 false를 반환 할 수 :
def balanceMain(elem: List[Char]): Boolean = { elem.isEmpty && count == 0 }
-
==============================
4.다른 대응없이 if 문 작성하지 마십시오. 당신이 당신의 조각에 다른 사람을 추가하면 당신은 당신의 진실과 거짓이 함수의 마지막 표현이 사실에있는 것을 볼 수 있습니다.
다른 대응없이 if 문 작성하지 마십시오. 당신이 당신의 조각에 다른 사람을 추가하면 당신은 당신의 진실과 거짓이 함수의 마지막 표현이 사실에있는 것을 볼 수 있습니다.
def balanceMain(elem: List[Char]): Boolean = { if (elem.isEmpty) if (count == 0) true else false else if (elem.head == '(') balanceMain(elem.tail, open, count + 1) else....
-
==============================
5.기본적으로 함수의 마지막 표현이 반환됩니다. 귀하의 예제에서 당신은 당신의 반환 값을 원하는 점, 이후 또 다른 표현이있다. 당신이 당신의 마지막 표현하기 전에 아무것도 반환하려는 경우, 당신은 여전히 수익을 사용해야합니다.
기본적으로 함수의 마지막 표현이 반환됩니다. 귀하의 예제에서 당신은 당신의 반환 값을 원하는 점, 이후 또 다른 표현이있다. 당신이 당신의 마지막 표현하기 전에 아무것도 반환하려는 경우, 당신은 여전히 수익을 사용해야합니다.
당신은 첫 번째 부분에서 부울을 반환,이처럼 예를 수정할 수 있습니다
def balanceMain(elem: List[Char]): Boolean = { if (elem.isEmpty) { // == is a Boolean resulting function as well, so your can write it this way count == 0 } else { // keep the rest in this block, the last value will be returned as well if (elem.head == "(") { balanceMain(elem.tail, open, count + 1) } // some more statements ... // just don't forget your Boolean in the end someBoolExpression } }
-
==============================
6.조기 반환 목적의 경우 검색을 사용. 그것은 어딘가에 돌아 작성 잊어의 부주의 한 실수를 방지 명시 적으로 모든 반환 지점을 선언하도록 강요합니다.
조기 반환 목적의 경우 검색을 사용. 그것은 어딘가에 돌아 작성 잊어의 부주의 한 실수를 방지 명시 적으로 모든 반환 지점을 선언하도록 강요합니다.
from https://stackoverflow.com/questions/12560463/return-in-scala by cc-by-sa and MIT license
'SCALA' 카테고리의 다른 글
[SCALA] 스칼라의 상징적 사업자 모두가 무엇을 의미합니까? (0) | 2019.10.30 |
---|---|
[SCALA] 어떻게 스파크 SQL의 사용자 정의 유형에 대한 스키마를 정의? (0) | 2019.10.30 |
[SCALA] 자바의 java.lang.Class <T> 객체의 스칼라 동등한 (0) | 2019.10.30 |
[SCALA] 왜 "메소드 오버로딩을 피하기?" (0) | 2019.10.30 |
[SCALA] 스칼라에서 JavaConverters과 JavaConversions의 차이점은 무엇입니까? (0) | 2019.10.30 |