2016-05-27 7 views
2

スカラバージョン= 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 
+3

識別子を同じスコープ内で同じ名前で定義することはできません。あなたの場合、2つの異なるスコープで同じ名前の識別子を定義します。これは合法です。 [この質問](http://stackoverflow.com/questions/7031106/why-does-scala-support-shadow-variables)も参照してください。 – TeWu

答えて

1

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 
() 
関連する問題