복붙노트

[SCALA] 스칼라 앞으로 참조 [중복]

SCALA

스칼라 앞으로 참조 [중복]

object Omg {

  class A

  class B(val a: A)

  private val b = new B(a)

  private val a = new A

  def main(args: Array[String]) {
    println(b.a)
  }

}

다음 코드 인쇄 "널 (null)". 자바합니다. 유사한 구조로 인해 잘못된 전방 참조의 컴파일되지 않습니다. 왜 스칼라에서 잘 컴파일 않습니다 - 질문은? 그 SLS에 설명 또는 2.9.1에서 단순히 버그, 디자인인가?

해결법

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

    1.그것은 버그 아니지만, 고전적인 오류가 스칼라를 배울 때. OMG 객체가 초기화 될 때, 모든 값은 우선 디폴트 값 (여기서는 NULL)와 생성자 (즉, 오브젝트 본체) 실행으로 설정된다.

    그것은 버그 아니지만, 고전적인 오류가 스칼라를 배울 때. OMG 객체가 초기화 될 때, 모든 값은 우선 디폴트 값 (여기서는 NULL)와 생성자 (즉, 오브젝트 본체) 실행으로 설정된다.

    그것에게 일을하려면, 당신이 앞으로 참조하는 선언 (값이이 경우에) 앞에 게으른 키워드를 추가 :

    object Omg {
    
      class A
    
      class B(val a: A)
    
      private val b = new B(a)
    
      private lazy val a = new A
    
      def main(args: Array[String]) {
        println(b.a)
      }
    }
    

    값 A는 필요에 따라 초기화됩니다.

    이 공사는 신속하고 스레드 안전 (값은 모든 응용 프로그램 런타임 일단 초기화)됩니다.

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

    2.내가 그것을 이해하는 방법은,이 스칼라 클래스가 생성되는 방법과 관련이있다. 자바에서는, 위에서 정의 된 클래스는 인라인 변수를 초기화하는 것, 그리고 아직 정의되지 않은 때문에, 컴파일 할 수 없습니다. 그러나, 스칼라는 자바에서이 더 등가 (같은 시나리오에서 널 (null)을 생산해야하는)입니다 :

    내가 그것을 이해하는 방법은,이 스칼라 클래스가 생성되는 방법과 관련이있다. 자바에서는, 위에서 정의 된 클래스는 인라인 변수를 초기화하는 것, 그리고 아직 정의되지 않은 때문에, 컴파일 할 수 없습니다. 그러나, 스칼라는 자바에서이 더 등가 (같은 시나리오에서 널 (null)을 생산해야하는)입니다 :

    class Omg {
      private B b = null;
      private A a = null;
    
      Omg(){ 
        b = new B(a);
        a = new A();
      }
    }
    

    또는, 당신이 그것을가 호출 될 때까지 연기 값을 설정하는 것입니다 게으른 B의 당신의 선언을 할 수있다 (이 시간되었을 것이다 세트를에서).

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

    3.이 문제가되는 경우 예외가 사라질 때까지, 개발 과정에서 -Xcheckinit 컴파일 및 반복 처리.

    이 문제가되는 경우 예외가 사라질 때까지, 개발 과정에서 -Xcheckinit 컴파일 및 반복 처리.

    사양 순서대로 실행 템플릿 바디 문에 대해 5.1; 블록 정방향 참조 4.0의 시작.

    앞으로의 참조 - 왜이 코드를 컴파일합니까?

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

    4.@paradigmatic 상태로, 정말 버그가 아니다. 이 선언의 순서를 다음 초기화 순서입니다. 또한이 경우, A는 B를 선언 / INIT-ED 널.

    @paradigmatic 상태로, 정말 버그가 아니다. 이 선언의 순서를 다음 초기화 순서입니다. 또한이 경우, A는 B를 선언 / INIT-ED 널.

    광고 전용 발 B를 변경 = 전용 지연 발 B의 새로운 B (a) = 초기화 지연 될 지연하여 새로운 사람 B (a) 수정한다 문제. 그것에 B의 첫 번째 구문입니다.

    그것은 매우 가능성이 동작은 SLS에 설명되어 있습니다.

  5. from https://stackoverflow.com/questions/12184997/scala-and-forward-references by cc-by-sa and MIT license