Nice programing

Scala에서 "early initializer"는 무엇입니까?

nicepro 2020. 11. 21. 09:15
반응형

Scala에서 "early initializer"는 무엇입니까?


Scala 의 프로그래머 능력 수준에 대한 Martin Odersky의 최근 게시물 에서 Expert 라이브러리 디자이너 섹션에 "초기 이니셜 라이저" 라는 용어가 포함되어 있습니다.

이것들은 Programming in Scala에서 언급되지 않았습니다 . 그들은 무엇인가?


초기 이니셜 라이저는 수퍼 클래스 이전에 실행되도록 의도 된 서브 클래스 생성자의 일부입니다. 예를 들면 :

abstract class X {
    val name: String
    val size = name.size
}

class Y extends {
    val name = "class Y"
} with X

코드가 다음과 같이 작성된 경우

class Z extends X {
    val name = "class Z"
}

그러면 Z초기화 될 때 널 포인터 예외가 발생합니다 . 이는 size초기화 name의 정상적인 순서 (클래스 이전의 수퍼 클래스)에서 이전 초기화되기 때문 입니다 .


내가 말할 수있는 한, 동기는 (위 링크에서 주어진 것처럼) 다음과 같습니다.

"당연히 val이 재정의 될 때 두 번 이상 초기화되지 않습니다. 따라서 위의 예에서 x2가 모든 지점에서 정의 된 것처럼 보이지만 이는 사실이 아닙니다. 재정의 된 val은 수퍼 클래스를 생성하는 동안 null로 표시됩니다. 추상적 인 가치처럼. "

왜 이것이 자연스러운 지 모르겠습니다. 할당의 rhs에 부작용이있을 수 있습니다. 이러한 코드 구조는 C ++ 또는 Java에서 완전히 불가능합니다 (그리고 해당 언어에 대해 말할 수는 없지만 Smalltalk를 추측합니다). 사실 생성자를 통해 이러한 이중 할당을 암시 적 ... ticilpmi ... EXplicit로 만들어야합니다. rhs 부작용 불확실성에 비추어 볼 때, 그것은 전혀 동기 부여가 아닌 것 같습니다 : ASSIGNMENT를 통해 슈퍼 클래스 부작용을 회피 할 수있는 능력 (이로 인해 슈퍼 클래스 불변성을 무효화하는 능력)? Ick!

안전하지 않은 코드 구조를 허용하는 다른 "킬러"동기가 있습니까? 객체 지향 언어는 이러한 메커니즘없이 약 40 년 (언어를 만든 후 계산하면 30 년 정도) 동안 해왔습니다. 왜 지금 포함시킬까요?

그건 ... 그냥 ... 위험 해 보이는데.


다시 생각해 보면 1 년 레이어 ...

이건 그냥 케이크예요. 말 그대로.

초기 아무것도 아닙니다. 그냥 케이크 (믹신).

Cake는 The Grand Pooh-bah 자신이 만든 용어 / 패턴으로, 클래스와 인터페이스의 중간에있는 Scala의 특성 시스템을 사용합니다. Java의 장식 패턴보다 훨씬 낫습니다.

소위 "인터페이스"는 이름이 지정되지 않은 기본 클래스에 불과하며 기본 클래스로 사용되던 것이 특성으로 작용하는 것입니다 (솔직히 알지 못했던 작업). "with'd"클래스가 논쟁을 할 수 있는지 (특성은 할 수 없음), 그것을 시도하고 다시보고 할 수 있는지는 나에게 분명하지 않습니다.

이 질문과 그 대답은 Scala의 가장 멋진 기능 중 하나에 들어갔습니다. 그것에 대해 읽고 경외감을 느끼십시오.

참고 URL : https://stackoverflow.com/questions/4712468/in-scala-what-is-an-early-initializer

반응형