3

値の初期化の問題が発生しました:

class Top 

class X(val v : Top) extends Top 
class Y extends Top 

X は、X や Y など、他の Top 型のオブジェクトを使用して構築されたクラスです。つまり、それ自体を使用して構築される可能性があります。例えば、

val x = new X(x) 

コンパイラは動作しますが、v フィールドにアクセスすると null が返されます。

scala> x.v 
res9: Top = null 

遅延初期化と名前によるパラメーターを試してみましたが、同じ結果が得られました。私の Scala バージョンは 2.9.1 です。誰でも私を助けることができますか?

4

2 に答える 2

5

肺、

how did your code with lazy and call-by-name look like? It works for me like this:

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 = X@422d15ad
于 2012-06-30T10:30:11.023 に答える
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 }

sealedパターン マッチングを使用する場合は、トレイトcase、オブジェクト、およびクラスにさらに追加できます。

于 2012-06-30T12:01:45.207 に答える