Scalaに入門したい。 #4 データ構造

前回Scalaに入門したい。 #3 制御構文 - 風の谷の備忘録は、制御構文について触れました。
今回はデータ構造についてやっていきたいと思います。

Array

Arrayリテラル

scala> val num =Array(1,2,3)
num: Array[Int] = Array(1, 2, 3)

Array型はミュータブルな型で、あとから再代入可能である。
変数をvalで宣言してもArray自体が変更可能なので以下のようなことが可能

scala> num.update(0,4)

scala> for (i <- num) 
     | println (i)
4
2
3

numの0番目を4に置き換えてみた。ふむ。
明示的に型をしていするなら

scala> val numarray = new Array[Int](3)
numarray: Array[Int] = Array(0, 0, 0)

という書き方も出来る。

List

Listリテラル

scala> val numlist = List(1,2,3)
numlist: List[Int] = List(1, 2, 3)

scalaのListはイミュータブルにあって、

scala> numlist(0)                      
res7: Int = 1

scala> numlist(0) = 4
<console>:6: error: value update is not a member of List[Int]
       numlist(0) = 4
                  ^

と怒られる。'='ってメソッドがListにはねえよってことですね。
もちろん格納先の変数をvarで宣言してやって、書き換えることは可能
でも参照透過性を確保するためにやめましょうって Scalaスケーラブルプログラミング[コンセプト&コーディング] (Programming in Scala) はおっしゃってます。
関数型的なコードではこういうのが基本みたいですね。
イミュータブルな値をつかい、さらにスコープを関数内だけに限定する関数単体の動作を保証するってスタンスらしい。
まあ手続き型でも考えることの気がするんだけど…副作用をもたないものを極力目指すらしいです。

ちなみにListの初期化は

scala> val num = 1 :: 2 :: 3 :: Nil
num: List[Int] = List(1, 2, 3)

これでも可能です、'::'はList型のもってる演算子(メソッド)。
演算子が全てメソッドってのも後でまとめた方がいいなあ、オーバーライドなんかも含めて

Tuple

Tupleリテラル

scala> val tuple = ("hoge",1234)
tuple: (java.lang.String, Int) = (hoge,1234)

Toupleはイミュータブルであるが、違う型のオブジェクトをぶち込むことが可能
そうすると要素にアクセスする方法がArrayなんかとは異なる

scala> val tuple = ("hoge",1234)
tuple: (java.lang.String, Int) = (hoge,1234)

scala> println(tuple._1)
hoge

scala> println(tuple._2)
1234

とこんな感じでアクセス
添字が0からじゃないところに注意ですねえ。


簡単ですが今回はここまで。
次回はデータ構造の続きをやります。setやmapなどに触れられればと思います。