Scala言語仕様 2.8 リーディング - 2 識別子・名前・スコープ
Scala言語仕様
日本語訳(Scala 2.8)
http://www.scala-lang.org/docu/files/LangSpec2.8-ja_JP.pdf
原文(Scala 2.9)
http://www.scala-lang.org/docu/files/ScalaReference.pdf
これはAkasaka.scala読書会の記録です
これはAkasaka.scalaでの読書会の記録です。私が事前にある程度準備しておいて、読書会当日に修正・追記を行います。
Scalaにおける名前は、エンティティ(型・値・メソッド・クラス)を識別します。
束縛(bindings)
束縛の優先順位
優先順位の高い順に並べると
- ローカル定義
- 継承先での定義
- 同じコンパイル単位でのパッケージ節を通して利用可能となった定義
- 明確なインポート(import collection.immutable.List)
- ワイルドカードインポート(import collection.immutable._)
- 同じコンパイル単位中にないパッケージ節を通して利用可能となった定義
ここで出てきた「コンパイル単位」がよくわからなかったですが、「Chapter A Scala 文法要約」に定義の記述がありました。
コンパイル単位 ::= {'package' 限定識別子 複文区切り} トップレベル文並び 限定識別子 ::= 識別子 {'.' 識別子}
サンプルを書いてみました。
package zzz { object Foo { val x = 234 } } package main { trait MyApp extend App { val x = 0 } object Main extends MyApp { override val x = 123 import zzz.Foo.x println(x) } }
Scala 2.9.1でscalacを実行するとwarningが出力されますが、コンパイルは成功します。
実行すると上記の優先順位の通り、123が出力されます。「zzz.Foo.x」は「同じコンパイル単位中にないパッケージ節を通して利用可能となった定義」に該当するので、ローカル定義のxが優先されています。
seratchs-iMac:foo seratch$ scalac sample.scala sample.scala:4: warning: imported `x' is permanently hidden by definition of value x in object Main import zzz.Foo.x ^ one warning found seratchs-iMac:foo seratch$ scala main.Main 123 seratchs-iMac:foo seratch$