Scala クラスp.X
、T
およびの定義を考えてみましょうY
。
package p {
object X {
val y: Int = 21
}
}
class T { val X = new Y(42) }
class Y(val y: Int)
val p = new T
p.X.y
これらの定義の後、識別子が何を参照しているのかという疑問が生じます。
y=21
classの値p.X
、または- 値
X.y=42
を介して参照される値にp
?
テストにより、バリアント 2 が使用されていることがわかります。
質問: これは SLS のどこで定義されていますか?
編集
状況を明確にするために、上記の例を次のコンパイル単位に変更/拡張しました。
package p {
object X { val y: Int = 21 }
}
class T { val X = new Y(42) }
class Y(val y: Int)
object p extends T
object Test extends App { println(p.X.y) }
ここで SLS セクション 2 の定義をどの程度正確に適用する必要があるかは、私には明確ではありません。アプリケーションのスコープではTest
バインディングが定義されておらず、コンパイル ユニットのスコープでは、2 つのバインディングobject p
およびpackage p
(または object p.x
) は同じ優先順位を持っているようです。