Scalaのインポートについてメモ

Instant Play Framework Starterを読み進めているが、Scalaを書いた事が無いので調べながら読み進めている。とりあえず、コップ本を読みながらパッケージのインポート周りを整理したのでメモしておく。

基本的なインポート文

クラスやオブジェクトを直接インポートするsingle type(単一型)と、パッケージ配下の全てのメンバをインポートするon demand(オンデマンド型)の2種類が存在する。on demandはJavaの*を使ってアクセスするのと等価。

// Fruitオブジェクトへのインポート(single type)
import bobsdelights.Fruit

// bobdelightsパッケージ下のすべてのメンバへアクセスする為のインポート(on demand)
import bobdelights._

任意の場所でインポート

Javaではソースの冒頭だけでなく、任意の場所でインポートできる。以下のように関数の内部でインポートを記述しても文法的には間違っていない。

def showFruit(fruit: Fruit) {
    import fruit._
    println(name + "s are " + color)
}

それだけでなく、Fruitオブジェクトを直接参照できるようになる。printlnで使用されているnameとcolorはFruitに定義されているメンバだ。

インポートセレクタ

インポートセレクターという機能を使うと特定のメンバーだけをインポートすることが出来る。特定のメンバだけ名前を変えたり、隠したりできる。これらは名前が重複する場合に重宝する。

// FuitsオブジェクトからApple, Orangeだけをインポートする
import Fruits.{Apple, Orange}

// FruitsオブジェクトのAppleを、McIntoshという名前でインポートする
import Fruits.{Apple => McIntosh, Orange}

// すべてのメンバをインポート(Fruits._と等価)
import Fruits.{_}

// Fruitsのメンバをインポートし、AppleをMcIntoshという名前でインポートする
import Fruits.{Apple => McIntosh, _}

// Pear以外のメンバをインポートする
import Fruits.{Pear => _, _}

暗黙のインポート

Scalaで何もインポートしなくても、以下のパッケージは暗黙のうちにインポートされる。

import java.lang._
import scala._
import Predef._

なので、scala.ListはListと書くことができる。java.langとscalaの両方のパッケージにStringBuilderが定義されているが、scalaのインポートがjava.langのインポートを隠す為、StringBuilderという単純名で参照されるクラスはscala.StringBuilderとなる。