복붙노트

[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. ==============================

    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. ==============================

    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. ==============================

    3.나는 스칼라 프로그램 모르겠지만, 암시 적 반환 (루비)와 다른 언어를 사용합니다. 당신은 당신의 경우 (elem.isEmpty) 블록 후 코드를 - 코드의 마지막 줄은 당신이 기대하고 무엇을받지 못하고있는 이유입니다 반환 무슨이다.

    나는 스칼라 프로그램 모르겠지만, 암시 적 반환 (루비)와 다른 언어를 사용합니다. 당신은 당신의 경우 (elem.isEmpty) 블록 후 코드를 - 코드의 마지막 줄은 당신이 기대하고 무엇을받지 못하고있는 이유입니다 반환 무슨이다.

    편집 : 여기에 너무 함수를 작성하는 간단한 방법입니다. 그냥 IsEmpty 함수의 부울 값을 사용하여 자동으로 true 또는 false를 반환 할 수 :

    def balanceMain(elem: List[Char]): Boolean =
    {
        elem.isEmpty && count == 0
    }
    
  4. ==============================

    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. ==============================

    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. ==============================

    6.조기 반환 목적의 경우 검색을 사용. 그것은 어딘가에 돌아 작성 잊어의 부주의 한 실수를 방지 명시 적으로 모든 반환 지점을 선언하도록 강요합니다.

    조기 반환 목적의 경우 검색을 사용. 그것은 어딘가에 돌아 작성 잊어의 부주의 한 실수를 방지 명시 적으로 모든 반환 지점을 선언하도록 강요합니다.

  7. from https://stackoverflow.com/questions/12560463/return-in-scala by cc-by-sa and MIT license