0

Scala クラスp.XTおよびの定義を考えてみましょう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これらの定義の後、識別子が何を参照しているのかという疑問が生じます。

  1. y=21classの値p.X、または
  2. 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) は同じ優先順位を持っているようです。

4

1 に答える 1

3

SLSの第2章、識別子、名前、スコープ

一部の内部スコープのバインディングは、同じスコープの優先順位が低いバインディングと、外部スコープの優先順位が同じまたは低いバインディングをシャドウします。

このセクションでは、優先順位のルールといくつかの例について説明します。あなたの例では、 (3つの参照)の最後の宣言は前者(オブジェクト)をシャドウpイングします

于 2012-06-25T15:20:49.913 に答える