値と変数、型推論

昨日、Scala のインストールが終わったので、今日から使ってみよう。

適当なフォルダに移動して sbt console コマンドで REPL を起動する。そして “Hello, World!” と入力してみる。

scala> "Hello, World!"
res0: String = Hello, World!

1行目が REPL のプロンプトと入力、2行目がそのレスポンスだ。ここでは入力された値が String 型で Hello, World! という値を持つことが表示されている。res0 ってのは REPL が勝手につけた名前らしい。これは後から使うこともできる。

scala> res0
res1: String = Hello, World!

いくつか値を入力してみよう。

scala> 123
res2: Int = 123

scala> 12345L
res3: Long = 12345

scala> 1.23
res4: Double = 1.23

scala> 1.23e4
res5: Double = 12300.0

scala> 1.0 == 1
res6: Boolean = true

それぞれ Int とか Double とかの型に解釈されている。Scala には型推論の機能が備わっているので、型を宣言しなくても適当な型に解釈してくれる。

次、変数。Scala では変数は宣言してからでないと使えない。変数の宣言には var と val の2つがあって、前者は再代入が可能だけど、後者は再代入できない。試してみよう。

scala> var x = 3
x: Int = 3

scala> x = 5
x: Int = 5

scala> x
res7: Int = 5

scala> val y = 2
y: Int = 2

scala> y = 7
<console>:12: error: reassignment to val
y = 7
^

var で宣言した x には再代入できているけど、val で宣言した y に再代入したらエラーになっているのがわかる。

Scala では基本的に再代入できない val で宣言した変数を使い、var はあまり使わないとのこと。このへんは関数型プログラミングらしいところかな。

ちなみに、var で宣言した x に再代入することはできるけど、宣言の時に型推論が働いて x の型は Int になっている。なので Int 以外の型を代入することはできない。

scala> x = "hello"
<console>:12: error: type mismatch;
found : String("hello")
required: Int
x = "hello"
^

さて、ここまでは変数の型は型推論に任せてきたけど、明示的に宣言することもできる。次のようにする。

scala> val z: Int = 3 * 3
z: Int = 9

型を変数名の後につけるのは Go に似てるな。

以上、とりあえずここまで。