minimize

事業拡大のため、新しい仲間を募集しています。
→詳しくはこちら

パッケージ宣言

Java と同じように先頭に package を記述することも可能だが、Scala ではもっと柔軟にできる。

package com.tedneward.scala.demonstration
{
  object App { ... }
}
package com.tedneward.scala.demonstration.test
{
  object AppTest { ... }
}

このように、package は任意の場所に複数配置できる。
ブロックの内部に書かれたコードのスコープはそのパッケージとなる。

こんなことも出来るぞ。

package com
{
  package tedneward
  {
    package scala
    {
      package demonstration
      {
        object App { ... }
      }
    }
  }
}

これで理論上は、単一の scala ファイルにシステムの全コードを収めることも可能だ。
誰か試してみてくれ(違。
納品が楽でいいね(ぇ

import の拡張

Java5(あたり)から取り入れられた、Static Import 構文。
Scala では、通常の import 文でこれを使える。

import java.text.DateFormat.MONTH_FIELD

後述するワイルドカードを使えば、さらに便利。

import BigInteger.{ONE, ZERO}
{
  if (arg == ZERO) ONE
}

こっちのが読みやすくて良い。

関数の import

Scala では、関数も import できる。

import scala.actors._, Actor._
val badActor =
  actor
  {
    receive { }
  }

例えば上の例の actor や receive は、Actor という object で定義された関数。
なんか Scala の構文が拡張されたような気分になってくる。
これを応用すると、ドメイン特化言語(DSL:Domain Specific Language) が作成できる。

ワイルドカード

Scala の import で使うワイルドカードはかなり多機能。

クラス

これは Java と同じ。ワイルドカードで指定した同階層の全クラスがそのままの名前で利用できる。

import java.text._
println(DateFormat.FULL)

定数

Java では Static Import と呼ばれていたもの。

import java.math.BigInteger._
println(ZERO)

パッケージ名

パッケージ名さえも import できる。

import net.liftweb._
import http._
import util.Helpers._
import common._

これは、以下に等しい。

import net.liftweb.http._
import net.liftweb.util.Helpers._
import net.liftweb.common._

便利だが、パッと見理解しにくいという欠点もあるので乱用は避けよう。

エイリアス

また、エイリアス(別名)を付けることもできる。

import javax.servlet.http.{
  HttpServletRequest => HSReq, HttpServletResponse => HSResp
}

こちらも多用すると危険なので、ルールを決めてほどほどに使おう。

import の適用範囲

def func() {
  import sample.Const._
  ...
}

このように、クラスの中やメソッドの中など、任意の場所で import 文を記述できる。
このスコープの中でだけ、import 文が有効になる。

これは特に上の例のようなワイルドカード指定のときに使えるテクニックだろう。
ワイルドカードにすると import する内容が増えすぎてしまい、ソースの可読性が落ちる危険性もある。
import 文を適切なブロック内に配置することで、これを最小限に防ぐことができる。