예 Scala가 클래스를 구성하고 초기화하는 방식으로 인해 의도 된 동작입니다. 클래스 B
에 아직 초기화되지 않은 반면, 값이 초기화 된 기능 f
클래스 C
에서 호출되는 순간
scala> class A {
| f
|
| implicit val arg = "foo"
|
| def f(implicit arg: String) = {
| println(arg)
| }
| }
defined class A
scala> class B {
| f(arg)
|
| val arg = "foo"
|
| def f(implicit arg: String) = {
| println(arg)
| }
| }
defined class B
scala> class C {
| implicit val arg = "foo"
|
| f
|
| def f(implicit arg: String) = {
| println(arg)
| }
| }
defined class C
scala> new A
null
res0: A = [email protected]
scala> new B
null
res1: B = [email protected]
scala> new C
foo
res2: C = [email protected]
이 예를 생각해 보자. A
클래스는 정확히 B
클래스와 동일합니다. 유일한 차이점은이 A
에 암시 적으로 전달된다는 것입니다.
이 코드는 멤버 변수를 선언하고 생성자 코드를 실행하기 때문에 2 가지 일을하기 때문에 다소 혼란 스럽습니다. 예를 들어 클래스 B
을 가져 오는 경우 val arg
은 f
이 호출되었지만 아직 초기화되지 않은 지점에서 선언됩니다. val arg = "foo"
초기화를 수행합니다. 자바이 번역되면 그것은 더 분명하게 : 도움이 될 것입니다 lazy val
또는 올바른 초기화 순서를 사용
public class B {
void f(String arg) {
System.out.println(arg);
}
String arg; // also acts as final in Scala
public B() {
f(arg);
arg = "foo";
}
}
가 그것을 해결하기 위해 :
scala> class B {
| f(arg)
|
| lazy val arg = "foo"
|
| def f(implicit arg: String) = {
| println(arg)
| }
| }
defined class B
scala> new B
foo
res3: B = [email protected]
당신은 경고에서 얻을 – drstevens