キーワードval、varで変数を宣言する方法を解説

Scala 3 (Dotty 0.26.0-RC1) 2.13.3 2.12.12
最終更新:2020年5月19日

[AD] scalapediaでは記事作成ボランティアを募集しています

どのようなプログラミング言語であっても、計算した値を格納する場所「変数」が用意されています。
では、Scalaではどうやって変数を定義するのでしょうか?
ここでは、Scalaで変数を定義する方法を解説します。

変数を定義する方法には、valとvarがある

Scalaでは、valvarを使用して変数を定義します。
構文は以下のとおりです。

val 変数名: 変数の型 = 値

varの場合はvalの代わりにvarを使用すること以外は、同じ構文です。

var 変数名: 変数の型 = 値

「変数の型」は、省略できます。
省略した場合は型推論によって、値から変数の型が決まります。

val 変数名 = 値

以下のように記載した場合は、右辺の値がIntなので「変数 x」の型は、Intになります。

val x = 100

valに代入できるのは1回限り

valvarの定義方法は理解できました。
では、valvarの違いは何でしょうか?

valvarの違う点は、valは定義した後に値を再代入できませんが、varは定義した後に値を再代入できることです。

以下のコードは、varを使用しているため、コンパイルすることができますが、

var x = 1 + 1 x = x * 2

以下のコードは、valを使用しているため、コンパイルエラーになります。

val x = 1 + 1 x = x * 2
error: reassignment to val

ただし、varであっても異なる型の値を再代入することはできません。
以下のコードは、Int型の「変数 x」に文字列"two"を再代入しようとしたためコンパイルエラーになります。

val x = 1 + 1 x = "two"
error: type mismatch; found : String("two") required: Int

基本的にvalを使用する

valvarの違いは理解できました。
では、valvarのどちらを使用すればよいのでしょうか?

以下の例を見てください。
以下の例は、両方とも1から9の数を足し合わせた数を求めています。

  • varを使用した例
var sum = 0 for(i <- 1 to 9) sum = sum + i
  • valを使用した例
val sum = (1 to 9).foldLeft(0) {(i, s) => s + i}

上記例は、非常に短いコードであるため、バグの入り込む余地はなさそうに見えますが、コードが複雑になった場合はどうでしょうか?
varを使用した場合は、変数 sumが、他のコードで書き換えられていないことを考慮する必要が出てきます。
valを使用すれば、定義後に書き換えること自体ができないため、そのような心配はありません。

基本的にはvalを使用して、どうしてもvalを使用して実装する方法がわからない場合にのみ、varを使用しましょう。

サイト内検索