2011-01-17 2 views
57

스칼라의 Martin Odersky의 recent post about levels of programmer ability에서 전문가 라이브러리 디자이너 섹션에는 "초기 초기화 프로그램"이 포함되어 있습니다.스칼라에서 "초기 이니셜 라이저"란 무엇입니까?

여기에 언급되지 않은 내용은 Programming in Scala입니다. 그들은 무엇인가?

+7

20 장에서 설명합니다.스칼라에서의 프로그래밍 중 5 개는 "미리 초기화 된 필드"라고 부릅니다. –

답변

91

초기 초기화 프로그램은 수퍼 클래스보다 먼저 실행될 하위 클래스 생성자의 일부입니다.

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

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

size 초기화의 정상적인 순서 (슈퍼 클래스에 name 전에 초기화되기 때문에 코드는 다음 널 포인터 예외가 Z 초기화 도착했을 때 발생할 수있는

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

으로 대신에 기록 된 경우 : 예를 들어, 수업 전).

+0

어떤 식 으로든 이것은 어색하게 명명 된'def nameInit : String; val name = nameInit','def nameInit = "foo"'? – nadavwr

+1

@nadavwr'def'는 클래스의 메소드 테이블에 의해 오버라이드 될 것이고, 따라서 가장 구체적인 버전이 실행되도록 보장합니다. 반면에'val' 초기화에는 아무 것도 없습니다 - 오버 라이딩되는 것은 초기화입니다. . –

2

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

"는 발를 오버라이드 (override)하는 자연적 때, 그것은 두 번 이상 초기화되지 않습니다하지만 그래서 위의 예에서 2 배. 모든 점에서 겉으로 정의 된 것처럼 보이지만 사실이 아닙니다. 오버 밸런스 된 val은 추상 클래스처럼 슈퍼 클래스 생성 중에 null로 표시됩니다. "

이것이 자연스러운 이유는 전혀 알 수 없습니다. r.h.s. 과제의 부작용이있을 수 있습니다. 이러한 코드 구조는 C++이나 Java에서 전혀 불가능합니다 (그리고 스몰 토크는 내가 말할 수는 없지만). 사실 당신은 그러한 이중 할당을 함축적으로 만들어야합니다 ... ticilpmi ... 생성자를 통해 해당 언어로 표현됩니다. r.h.s. 부작용의 불확실성을 고려할 때, 실제로는 많은 동기 부여와 같이 보이지 않습니다 : 할당을 통해 수퍼 클래스 부작용을 회피하여 (따라서 수퍼 클래스 불변량을 제거하는) 능력? Ick!

안전하지 않은 코드 구조를 허용 한 다른 "킬러"동기가 있습니까? 객체 지향 언어는 약 40 년 동안 (30 년 이상, 언어 생성으로 계산한다면) 지금까지 왜 그런 메커니즘을 사용하지 않았습니까?

그것은 ... 그냥 ... 위험한 것 같습니다.

+0

이것은 나에게도 완전히 이해가되지 않는다. 그리고 일단 내가 값을 무시하기 시작하면 나는 이미 위험한 지역에 있다고 주장 할 것이다. val에 할당 된 def를 재정의하면 훨씬 나에게 의미가 있습니다. 킥에 대한 스타일 제안 : "암시 적 ... ticilpmi ... 명시 적"-> "impli [^ H^H^H^H^H] (http://en.wikipedia.org/wiki/Backspace#.5EH) 명시 적으로 " – nadavwr

+0

누군가는 분명히 종이 기반 단말기를 사용한 적이 없다 ... 예, 아이들 ... 그들은 한 번 그랬습니다 :-) –

1

두 번째 생각에서 1 년 동안 ...

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

아직 초기 단계는 아닙니다. 그냥 케이크 (믹스 인).

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

소위 "인터페이스"는 이름없는 기본 클래스 일 뿐이며, 기본 클래스로 사용 된 것은 특성으로 작용합니다 (솔직히 알지 못했지만). "with'd"클래스가 인수를 취할 수 있는지 (형질이 맞지는 않는지), 시도하고 다시보고하는지는 내게 불분명하다.

이 질문과 답변은 스칼라의 가장 멋진 기능 중 하나에 들어서 있습니다. 그것을 읽고 경외해라.

+0

스칼라의 EBNF에서 :'ClassTemplate :: = [EarlyDefs] ClassParents [TemplateBody]', 'AnnotType}'과 'Constr :: = AnnotType {'('[Exprs]') '}'을 사용하면 "with'd"클래스가 인수를 취할 수 있다고 말하고 싶습니다. – themarketka

관련 문제