2012-06-30 2 views
3

나는 값 초기화 문제가 발생했습니다. 예를 들어,자기 기준값

val x = new X(x) 

컴파일러가 작동하지만 v 필드에 액세스 할 때 null이 반환됩니다.

scala> x.v 
res9: Top = null 

나는 게으른 초기화 및 이름 별 매개 변수를 사용하여 동일한 결과를 얻으려고 시도했습니다. 내 스칼라 버전은 2.9.1입니다. 누구든지 나를 도울 수 ???

안부, 친 - 폐 장

답변

5

폐,

방법을했다하여 코드 게으른과 통화에서 이름처럼? 그것은 나를 위해 이런 식으로 작동합니다 :

class Top 
class X(_v: => Top) extends Top { 
    lazy val v = _v 
} 

scala> lazy val x: X = new X(x) 
x: X = <lazy> 

scala> x.v 
res3: Top = [email protected] 
+0

답장을 보내 주셔서 감사합니다. by-name 매개 변수와 lazy 필드의 조합은이 예제에서 완벽하게 작동합니다. 하지만 실제로 필자가 직면 한 것은 by-name 매개 변수를 사용해야 할 경우 반복되는 by-name 매개 변수가 필요하다는 것입니다. 예 : 클래스 X (val v : => 위쪽 *) 위로 확장 시도했지만 지금은 scala로 지원하지 않았습니다. 더 나은 해결책이 있습니까? Chin-Lung Chang –

+0

두 개의 함수 ('class X (v :() => Top) *)'를 사용하거나'Top' 주위에 지연 래퍼를 빌드하면됩니다. 어쨌든'Top' 자체에 대한 참조를 전달해야하는 이유는 무엇입니까? – drexin

+0

일부 데이터는 자연스럽게 재귀 적입니다. 예를 들어, DTD에서 XML 요소의 정의를 재귀 적으로 정의 할 수 있습니다 (예 :

0

이것은 실제로 불행한 일이며, Scala 2.9.2에서도 발생합니다. 그래도 거기에 유형을 추가해야합니다. 따라서 val x: X = new X(x)입니다. 나는 컴파일러가 열의있는 인수 인 v으로 성공할 수 없으므로이를 분명히 거부해야한다고 생각한다.

정확한 시나리오가 무엇인지 모르지만 데이터 구조 인 것 같습니다. 어쩌면 당신을 위해 다음과 같은 작품과 같은 접근 방식은

trait Top 
trait X extends Top { def v: Top } 

object TopLoop extends X { def v: Top = this } 
class Y(x: X) extends Top { def v: Top = x } 

는 패턴 매칭을 사용하려는 경우, 당신은 또한 객체와 클래스에 특성에 sealedcase를 추가 할 수 있습니다.