복붙노트

[SCALA] 메소드의 리턴 타입에 추론 유형

SCALA

메소드의 리턴 타입에 추론 유형

왜 스칼라는 명시 적 return 문이 방법이 사용되는 경우 메서드의 반환 유형을 추론에 실패하는?

예를 들어, 왜 다음과 같은 코드를 컴파일합니까?

object Main {
    def who = 5
    def main(args: Array[String]) = println(who)
}

그러나 다음은하지 않습니다.

object Main {
    def who = return 5
    def main(args: Array[String]) = println(who)
}

해결법

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

    1.방법의 반환 유형 중 하나를 정의하는 블록의 마지막 문장의 유형 또는 표현의 유형을 정의 그것이, 블록의 부재이다.

    방법의 반환 유형 중 하나를 정의하는 블록의 마지막 문장의 유형 또는 표현의 유형을 정의 그것이, 블록의 부재이다.

    당신이 방법 안에 반환을 사용할 때 방법은 반환 할 수있는 또 다른 문을 소개합니다. 즉 스칼라가 발견 된 시점에서 그 수익의 유형을 결정할 수 없음을 의미합니다. 대신, 다음, 방법이 끝날 때까지 계속 자신의 유형을 추론하는 모든 출구 지점을 결합하고 다시이 종료 점의 각각에 가서 자신의 유형을 지정해야합니다.

    이렇게하려면 컴파일러의 복잡성을 증가시키고 수익을 사용할 때 반환 유형을 지정하지 않아도의 유일한 이익을 위해, 그것을 천천히 것입니다. 본 시스템에서, 다른 한편으로는, 반환 유형을 추론하는 것은 스칼라 이미 사용 제한된 타입 추론에서 무료로 제공됩니다.

    그래서, 결국, 컴파일러의 복잡성과 이익 사이의 균형이 한 수에, 후자는 전자의 가치가없는 것으로 간주되었다.

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

    2.그것은 컴파일러 (언어)의 복잡성을 증가시킬 것이다. 그것은 정말 펑키 그런 일에 타입 추론을 수행 할 수 있습니다. 당신은 하나의 표현이있을 때 관련 어떤 유형의 추론과 마찬가지로, 모두가 잘 작동합니다. 흩어져 반환 문 효과적으로 통합하기가 매우 끈적 다네 암시 분기를 많이 만들 수 있습니다. 그것은 단지 끈적 특히 어려운 것이 아니다. 예를 들면 :

    그것은 컴파일러 (언어)의 복잡성을 증가시킬 것이다. 그것은 정말 펑키 그런 일에 타입 추론을 수행 할 수 있습니다. 당신은 하나의 표현이있을 때 관련 어떤 유형의 추론과 마찬가지로, 모두가 잘 작동합니다. 흩어져 반환 문 효과적으로 통합하기가 매우 끈적 다네 암시 분기를 많이 만들 수 있습니다. 그것은 단지 끈적 특히 어려운 것이 아니다. 예를 들면 :

    def foo(xs: List[Int]) = xs map { i => return i; i }
    

    내가 너희에게 무엇을, 컴파일러 추론 여기합니까? 컴파일러는 명시 적 반환 문으로 추론을 수행한다면, 그것은 하나가 될 필요가있다. 사실, 명시 적 반환 계산서를 가진 방법을 많이 사용하면 로컬이 아닌 반환에 몰래하지 않는 경우에도, 모든 반환 끝날 것입니다. 끈적 끈적한, 내가 말했듯이.

    그리고 그 위에,이 장려되어야한다 언어 기능은 없습니다. 명시 반환 한 명시 적 반환이되지 않는 코드 선명도를 개선하고하지 않는 함수의 끝. 그 이유는 당신이 감독 그래프로 코드 경로를 볼 수 있는지 확인하는 것이 매우 쉽다. 앞서 말했듯이, 흩어져 반환 이상한 그래프에 잎뿐만 아니라 본체에 별도의 경로를 많이 생산하고 암시 적 분기를 많이 생산하고 있습니다. 그냥 펑키입니다. 제어 흐름은 가지 모든 명시 적 (패턴 매칭 또는 표현하는 경우) 있는지 확인하는 것이 훨씬 쉽게하고 농산물 값 측면 초래 반환 진술에 의존하지 않는 경우 코드는 훨씬 더 많은 기능이 될 것입니다.

    다른 몇몇은 "낙담"같은 스칼라의 기능 (예를 들어 asInstanceOf 오히려 같은보다), 언어의 디자이너는 일이 적은 쾌적한 고의적 인 선택을했다. 이것은 형식 유추 모두에서 결과의 실제 무익하지만, 대부분의 경우의 고안에 도입하는 복잡성과 결합. scalac는 추론 이런 종류의 시도하는 것은 단지 이해가되지 않습니다.

    이야기의 교훈은 : 당신의 반환을 산란하지 않는 배우! 즉 어떤 언어에서 좋은 조언뿐만 아니라 스칼라입니다.

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

    3.이 (2.8.Beta1)을 감안할 때 :

    이 (2.8.Beta1)을 감안할 때 :

    object Main {
      def who = return 5
      def main(args: Array[String]) = println(who)
    }
    <console>:5: error: method who has return statement; needs result type
             def who = return 5
    

    ... 그렇지 실수로 보인다.

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

    4.왜 그런지 모르겠어요. 아마도 그냥 반환 문의 사용을 억제합니다. :)

    왜 그런지 모르겠어요. 아마도 그냥 반환 문의 사용을 억제합니다. :)

  5. from https://stackoverflow.com/questions/2209179/type-inference-on-method-return-type by cc-by-sa and MIT license