[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.그것은 버그 아니지만, 고전적인 오류가 스칼라를 배울 때. 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.내가 그것을 이해하는 방법은,이 스칼라 클래스가 생성되는 방법과 관련이있다. 자바에서는, 위에서 정의 된 클래스는 인라인 변수를 초기화하는 것, 그리고 아직 정의되지 않은 때문에, 컴파일 할 수 없습니다. 그러나, 스칼라는 자바에서이 더 등가 (같은 시나리오에서 널 (null)을 생산해야하는)입니다 :
내가 그것을 이해하는 방법은,이 스칼라 클래스가 생성되는 방법과 관련이있다. 자바에서는, 위에서 정의 된 클래스는 인라인 변수를 초기화하는 것, 그리고 아직 정의되지 않은 때문에, 컴파일 할 수 없습니다. 그러나, 스칼라는 자바에서이 더 등가 (같은 시나리오에서 널 (null)을 생산해야하는)입니다 :
class Omg { private B b = null; private A a = null; Omg(){ b = new B(a); a = new A(); } }
또는, 당신이 그것을가 호출 될 때까지 연기 값을 설정하는 것입니다 게으른 B의 당신의 선언을 할 수있다 (이 시간되었을 것이다 세트를에서).
-
==============================
3.이 문제가되는 경우 예외가 사라질 때까지, 개발 과정에서 -Xcheckinit 컴파일 및 반복 처리.
이 문제가되는 경우 예외가 사라질 때까지, 개발 과정에서 -Xcheckinit 컴파일 및 반복 처리.
사양 순서대로 실행 템플릿 바디 문에 대해 5.1; 블록 정방향 참조 4.0의 시작.
앞으로의 참조 - 왜이 코드를 컴파일합니까?
-
==============================
4.@paradigmatic 상태로, 정말 버그가 아니다. 이 선언의 순서를 다음 초기화 순서입니다. 또한이 경우, A는 B를 선언 / INIT-ED 널.
@paradigmatic 상태로, 정말 버그가 아니다. 이 선언의 순서를 다음 초기화 순서입니다. 또한이 경우, A는 B를 선언 / INIT-ED 널.
광고 전용 발 B를 변경 = 전용 지연 발 B의 새로운 B (a) = 초기화 지연 될 지연하여 새로운 사람 B (a) 수정한다 문제. 그것에 B의 첫 번째 구문입니다.
그것은 매우 가능성이 동작은 SLS에 설명되어 있습니다.
from https://stackoverflow.com/questions/12184997/scala-and-forward-references by cc-by-sa and MIT license
'SCALA' 카테고리의 다른 글
[SCALA] 왜 SparkContext.textFile의 파티션 매개 변수는 적용되지 않습니다? (0) | 2019.11.09 |
---|---|
[SCALA] 스파크 Dataframe하십시오 인덱스 열을 추가하는 방법 : 아카 데이터 색인 분산 (0) | 2019.11.09 |
[SCALA] 스파크 DataFrame : 해 orderBy 후 GROUPBY 그 질서를 유지 하는가? (0) | 2019.11.09 |
[SCALA] 스칼라의 인수로 여러 줄 함수 리터럴 (0) | 2019.11.09 |
[SCALA] 스칼라 : 암시 적 매개 변수 해상도 우선 순위 (0) | 2019.11.09 |