Scala Specification状態:
結合は、単一の名前によって定義されたエンティティが 単純な名前を使用してアクセスすることができる範囲を有します。スコープはネストされています。 内部スコープ内のバインディングシャドウ同じスコープ内の同じ優先度のバインディング( )は、外側スコープ内の同じまたはより低い優先順位のバインディングと同様です。
あなたは方法、およびパッケージ内で定義されたオブジェクトのための別の内部で定義されたTrouble
のための1つのスコープを持っています。これらのスコープはそれぞれ独立しているため、名前の衝突はありません。あなたは方法範囲にあなたの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))
}
}
はその後、コンパイラは文句を言うだろう:のためのパスカルケースを使用するdiscuragedされていることを
Error:(9, 9) Trouble is already defined as object Trouble
val Trouble = Array(1, 2, 3, 4)
^
注意を変数名。 unapply
方法を持っているタイプは、例えば、タイプ分解のためにも使用することができるように、1つはすぐに混乱することができます。
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
()
識別子を同じスコープ内で同じ名前で定義することはできません。あなたの場合、2つの異なるスコープで同じ名前の識別子を定義します。これは合法です。 [この質問](http://stackoverflow.com/questions/7031106/why-does-scala-support-shadow-variables)も参照してください。 – TeWu