2012-01-18 4 views
5

이 예제에서 오류가 발생하지 않고 b가 기본값을 유지하는 이유는 무엇입니까?스칼라 값 초기화

scala> val b = a; val a = 5 
b: Int = 0 
a: Int = 5 

답변

11

당신이 REPL에서이 작업을 수행 할 때 효과적으로 일을 :

class Foobar { val b = a; val a = 5 } 

B와는 당신이 B를 할당하고 당시 있도록하는이 순서에 할당 필드 a는 아직 할당되지 않았으므로 기본값은 0입니다. Java에서는 필드를 정의하기 전에 참조 할 수 없기 때문에이 작업을 수행 할 수 없습니다. 나는 당신이 게으른 초기화를 허용하기 위해 이것을 할 수 있다고 생각한다.

당신은 더 명확하게 다음과 같은 코드를 사용하는 경우이를 볼 수 있습니다

scala> class Foobar { 
    println("a=" + a) 
    val b = a 
    println("a=" + a) 
    val a = 5 
    println("a=" + a) 
} 
defined class Foobar 

scala> new Foobar().b 
a=0 
a=0 
a=5 
res6: Int = 0 

당신이 aa는 방법 할 경우 할당 된 올바른 값을 가질 수 있습니다

class Foobar { val b = a; def a = 5 } 
defined class Foobar 
scala> new Foobar().b 
res2: Int = 5 

를하거나 바 게으른 할 수 있습니다 val :

scala> class Foobar { lazy val b = a; val a = 5 } 
defined class Foobar 

scala> new Foobar().b 
res5: Int = 5 
+2

그런 상황에서 경고를 내서는 안됩니까? 이후 그것은 확실한 버그 인 것 같고 때로는 재미있는 버그로 이어질 것입니다. – Rogach

+0

@Rogach 필자가 생각하는 스칼라 컴파일러에서는 경고가 될 수 있지만 유용 할 수도 있습니다. 게으른 평가. scalastyle (https://github.com/scalastyle/scalastyle)과 같은 스타일 검사기의 영역에서 더 많은 것 –

+0

@Rogach 이러한 상황을 안정적으로 감지하는 것은 불가능하지는 않더라도 어렵습니다. Scalac은 간단한 경우에 대해 경고를 표시합니다. –