这个申请失败的例子?

时间:2016-05-27 11:25:35

标签: scala

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

1 个答案:

答案 0 :(得分:1)

Scala Specification州:

  

绑定具有范围,其中由单个名称定义的实体可以   使用简单的名称访问。范围是嵌套的。一些绑定   内部范围阴影与优先级相同的较低优先级的绑定   以及外部范围中相同或更低优先级的绑定。

方法中有一个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
()