値と変数、型推論

2019年5月1日
1 分

昨日、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 では変数は宣言してからでないと使えない。変数の宣言には varval の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 に似てるな。

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