seratch's weblog in Japanese

About Scala, Java and Ruby programming in Japaense. If you need English information, go to http://blog.seratch.net/

Scala言語仕様 2.8 リーディング - 2 識別子・名前・スコープ

これはAkasaka.scala読書会の記録です

これはAkasaka.scalaでの読書会の記録です。私が事前にある程度準備しておいて、読書会当日に修正・追記を行います。

http://akskscala.github.com/


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$