복붙노트

[SCALA] 스칼라에서,는 "초기 초기화"무엇인가?

SCALA

스칼라에서,는 "초기 초기화"무엇인가?

전문가 라이브러리 디자이너 섹션에서 스칼라 프로그래머 능력의 수준에 대한 마틴 오더 스키의 최근 게시물에서 그는 용어는 "초기 초기화"를 포함하고 있습니다.

이들은 스칼라 프로그래밍에 언급되지 않습니다. 그들은 무엇인가?

해결법

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

    1.초기 초기화는 슈퍼 클래스 전에 실행하기위한 것입니다 서브 클래스의 생성자의 일부입니다. 예를 들면 :

    초기 초기화는 슈퍼 클래스 전에 실행하기위한 것입니다 서브 클래스의 생성자의 일부입니다. 예를 들면 :

    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가 초기화되었다 때 발생하는 것 (슈퍼 클래스 전).

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

    2.지금까지 내가 말할 수있는, (위의 링크에 주어진) 동기는 다음과 같습니다

    지금까지 내가 말할 수있는, (위의 링크에 주어진) 동기는 다음과 같습니다

    . 위의 예에서 X2는 겉으로는 모든 점에서 정의하지만 그래서 "는 발를 오버라이드 (override)하는 자연적 때, 그것은 두 번 이상 초기화되지 않으며,이 경우되지 않습니다 : 재정의 된 발은 상위 클래스의 건설 중에 널 (null)로 나타납니다, 추상적 인 발 것이다있다. "

    이 모든 자연 왜 표시되지 않습니다. 그것은 완전하게 가능하다 그 r.h.s. 할당의 부작용이있을 수 있습니다. 이러한 코드 구조는 C ++ 또는 Java 중 하나를 완전히 불가능합니다 (그리고 내가 그 언어에 대해 말할 수 있지만 나는 스몰 토크를 생각합니다). 사실 당신은 생성자를 통해 그 언어로 듀얼 지정이 ... ticilpmi ... 암시 명시해야한다. r.h.s. 비추어 양도를 통해 슈퍼 부작용을 회피 할 수있는 능력 (따라서 슈퍼 클래스 불변 무효화) : 부작용의 불확실성, 정말 전혀 동기 부여의 대부분은 아닌 것 같아? 싫어지기!

    이러한 안전하지 않은 코드 구조를 허용하는 다른 "킬러"동기가 있습니까? 왜 지금 그것을 포함, (당신이 언어의 창조로부터 계산하면, 30여 년) 객체 지향 언어는 약 40 년 동안 이러한 메커니즘없이 짓을 한거야?

    그것은 ... 그냥 ... 위험 ... 보인다.

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

    3.제 생각에, 년 후 ...

    제 생각에, 년 후 ...

    이것은 단지 케이크입니다. 말 그대로.

    아니 초기 아무거나. 그냥 케이크 (유지 mixin).

    케이크는 그랜드 만들어 낸 용어 / 패턴, 클래스와 인터페이스의 중간 인 스칼라의 특성 시스템을 사용 하나를 자신을 푸우 - 바하. 그것은 자바의 장식 패턴보다 훨씬 낫다.

    소위 "인터페이스"단지 익명의 기본 클래스이며, 무엇을 사용하면 기본 클래스 (나는 솔직히 할 수 몰랐) 형질의 역할을 할 수 있습니다. 는 "with'd"클래스 (특성은 할 수 없습니다) 인수를 할 수 그것을 시도하고 다시보고 있다면 그것은 나에게 명확하지 않다.

    이 질문의 답은 스칼라의 멋진 기능 중 하나에 강화하고있다. 거기에 최대 읽기 및 경외합니다.

  4. from https://stackoverflow.com/questions/4712468/in-scala-what-is-an-early-initializer by cc-by-sa and MIT license