高卒文系Scala vol.3 - Scalaの変数定義 -

前回、前々回と全然Scalaっぽくありませんでしたが、やっとScalaのプログラミングの話に入っていきます。

しばらくは、ごくごく基本的なところを復習する感じで行きたいと思ってます。

今回は下記Scala本の2.2あたり。

Scalaの変数定義には「val」と「var」の二種類があります。

違いを簡単に言うと、以下のとおり。

  • val ・・・初期化後に再代入できない。要は定数。
  • var ・・・初期化後に再代入可能。みなさんお馴染みの普通の変数。

「val」はJavaのfinal変数、C++のconst変数、PL/SQLのconstant変数とかと同じ。

プログラミングのパラダイムの一つに、再代入不可な変数を積極的に利用して、

可読性を向上させたり、プログラミングミスを低減させたり・・・ってのがありますね。

それと同じ意図かな、と今のところは感じています。

保守してると、たった「final」の一単語で注意すべき箇所がぐっと減ったりもするので、

複雑なロジックを実装するときは特に、「final」などの再代入不可な変数を効果的に使っていきたいですね。

ちなみに両方とも宣言と同時に初期化する事が必須になっているようです。

再代入できる「var」も、宣言と同時に初期化しないとコンパイルエラーになります。

var sample
sample = "Hello!"
println(sample)

上記のスクリプトを実行すると、下記のようなエラーが出ます。

(fragment of run.bat):3: error: '=' expected but ';' found.
var sample
^
one error found
!!!
discarding <script preamble>

宣言と同時に初期化すると、エラーは出なくなります。

var sample = "Hello"
println(sample)
D:\Scala\sample3>run.bat
Hello

「なんで宣言と同時に初期化が必要なのか」というと、「型推論」の為だと思います。

Scalaは、変数宣言に明示的に型を指定しなくても、コンパイラが勝手に型を予測してくれます。

変数宣言時に初期化しないと、その変数の型が決められないんでしょう、たぶん・・・

val str = "zetta"
val integer = 1985
println(str + integer)

うん、便利。静的型付け言語の冗長的な所がすっきりした感じです。

上記は型指定を略した例ですが、以下のように明示的に型指定をする事もできます。

val str: String = "zetta"
val integer: Int = 1985
println(str + integer)

型指定は、変数名の後に記述します。

もちろん、型指定は完全修飾名でも単純名でもどちらでもOKです。

C++やJava辺りしかやった事ない人は、違和感ありまくりだと思いますが、

型推論の為に必要な記述ルールだそうなので我慢して下さいw

「valとvar、どっちがどっちだったっけー?」ってよくなるんですが・・・

  • valの「l」は「last substitution」(最後の代入)
  • varの「r」は「re-substitution」(再代入)

って感じで覚えてます。

参考までにw

このエントリーをはてなブックマークに追加
comments powered by Disqus