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=21到class中的值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没有定义绑定,并且在编译单元的范围内,两个绑定object ppackage p(或对象p.x)似乎具有相同的优先级。

4

1 回答 1

3

SLS的第 2 章,标识符、名称和范围

某些内部作用域中的绑定会隐藏相同作用域中较低优先级的绑定以及外部作用域中相同或较低优先级的绑定

本节继续给出优先规则和一些示例。p在您的示例中, (thre reference )的最后声明隐藏了前者 (the object )

于 2012-06-25T15:20:49.913 回答