牛尾 剛(うしお つよし)
 大手SIベンダにてSEやPMやアーキテクトとして勤務したのち,現在は株式会社豆蔵のチーフコンサルタント。主に超上流のプロセスである要求開発やオブジェクト指向,アジャイル開発のコンサルタントとして活躍中。開発の現場にこだわり,開発の現場を少しでもよくしたいと日夜奮闘している。要求開発アライアンス 執行委員。著書に『オブジェクト脳のつくり方』や『eXtreme Programming実践レポート』(ともに翔泳社発行。後者は共著)などがある。

 前回,Scalaの3種類の実行方法を学びましたので,今回は基本的な文法を説明していきます。

 Scalaのぶっ飛んだ特徴を早く説明したいところですが,千里の道も一歩から。じっくり楽しみつつ,進んでいきましょう。

1.変数

 最初にScalaの変数について説明します。ここでは,すべてscalaの対話式実行環境(本連載ではScalaインタプリタと言います)で説明したいと思います。scalaのインストール方法や実行方法は連載第1回を参照してください。

 Scalaインタプリタの実行方法は,引数なしでscalaとタイプするたけです。後はコマンドを打ち込んでいくだけで,その行が評価されます。

>scala
Welcome to Scala version 2.7.1-final (Java HotSpot(TM) Client VM, Java 1.5.0_14)
.
Type in expressions to have them evaluated.
Type :help for more information.

scala>

 早速,実際にコードを打ちこみながら試してみましょう。

 Scalaでは,「val」と「var」という2種類の変数があります。valは,再代入不可の変数で,Javaで言うとfinal句がついた変数に相当します。一方,varは再代入可の変数で,Javaで言うとfinal句がついていない普通の変数に相当します。

 ちなみに,「val」はvalueの略で,valueとは「データや一つのオブジェクト」を指す言葉です。「var」のほうは,普通にvariable(変数)の略ですね。

 最初にvalを使った変数定義から見ていきましょう。

scala> val num = 2
num: Int = 2

 numという変数に2を代入してみました。Scalaインタプリタがnum: Int = 2という結果を返しています。これは,Int型のnumという名前の変数を定義して,2で初期化したという意味です。

 このnumの型は,Scalaインタプリタが型を推論して決定します。例えば,文字列を入れるとこうなります。

scala> val string = "scala"
string: java.lang.String = scala

 では実際に,変数を使ってみます。

scala> num * 2
res0: Int = 4

 前述の通り,valタイプの変数は再代入できません。実際に再代入しようとすると,

scala> num = 5
<console>:7: error: assignment to immutable value
       num = 5
           ^

 きっちりエラーになりました。

 次にvarを使ってみましょう。こちらは再代入可能です。

scala> var num = 3
num: Int = 3

scala> num = 4
num: Int = 4

 ちゃんと再代入できています。ではここに文字列型を代入してみましょう。

scala> num = "scala"
<console>:7: error: type mismatch;
 found   : java.lang.String("scala")
 required: Int
       num = "scala"
             ^

 しっかりエラーになりました。Rubyの変数の動的型と異なり,Scalaでは,変数に違う型のインスタンスを代入するとエラーが起こります。これは,プログラマが明示的に型を指定しなくても,定義した時点でScalaが型を決定するからです。

 変数に明示的に型を定義したい場合は,変数名の後にコロン「:」で指定します。

scala> var num:Int = 3
num: Int = 3

scala> var num:Int = "string"
<console>:4: error: type mismatch;
 found   : java.lang.String("string")
 required: Int
       var num:Int = "string"
                     ^

 当然,指定した型と右辺が異なればエラーになります。この明示的な型指定は,もちろんvalでも使用可能です。