Scala版本= 2.10.6 由于重复使用的标识符,该代码是否应该失败?
object ScalaTest {
def main(args: Array[String]) {
val Trouble = Array(1, 2, 3, 4)
println(Trouble(2))
}
}
object Trouble {
def apply(i: Int) = println("in trouble")
}
打印:
3
答案 0 :(得分:1)
绑定具有范围,其中由单个名称定义的实体可以 使用简单的名称访问。范围是嵌套的。一些绑定 内部范围阴影与优先级相同的较低优先级的绑定 以及外部范围中相同或更低优先级的绑定。
方法中有一个Trouble
范围,包中定义的另一个范围。由于这些范围中的每一个都是独立的,因此没有名称冲突。
如果您将Trouble
对象的定义移到方法范围内:
object ScalaTest {
def main(args: Array[String]) {
object Trouble {
def apply(i: Int) = println("in trouble")
}
val Trouble = Array(1, 2, 3, 4)
println(Trouble(2))
}
}
然后编译器会抱怨:
Error:(9, 9) Trouble is already defined as object Trouble
val Trouble = Array(1, 2, 3, 4)
^
请注意,对于变量名称使用pascal case是很常见的。人们很快就会感到困惑,因为具有unapply
方法的类型也可能用于类型分解,例如:
object Trouble {
def unapply(ints: Array[Int]): Option[Int] = Some(ints(0))
def apply(i: Int) = println("in trouble")
}
现在当你跑:
object ScalaTest {
def main(args: Array[String]) {
val Trouble() = Array(1, 2, 3, 4)
println(Trouble(2))
}
}
结果完全不同:
in trouble
()