2010年03月27日 20:47

Scalaのメモ その4 リスト

Scalaのメモその3の続き。



配列は Array を使う。[] で要素の型を指定し、()で要素数を指定する。要素へのアクセスはJavaでは [] だが、Scalaでは () を使う。val で不変の変数を宣言しても配列自体は可変となるので、要素に代入が可能。
val a = new Array[Int](3);
a(0) = 3;
a(1) = 4;
a(2) = 5;
for(o <- a){
	println(o);
}



new で生成せずに、関数呼び出しと同じような構文で初期化された配列を生成することが可能。
val a = Array(1, 2, 3);
a(0) = 8;
for(o <- a){
	println(o);
}
// 8 2 3 が出力
引数で整数を指定しているので、a の型は Array[Int] と型推論される。



Listも配列だが、こちらは不変オブジェクト(イミュータブル)になるので、要素に代入しようとするとエラーになる。
val a = List(1, 2, 3);
// a(0) = 8; // この行を入れるとコンパイルエラーになる
for(o <- a){
	println(o);
}
// 1 2 3 が出力
a の型は List[Int] と型推論される。



List(1, 2.0, 3) とすると、要素に浮動小数点数が含まれるので、new List[AnyVal] という型に推論される。AnyValIntDoubleBooleanなどJavaのプリミティブ型のオブジェクトのスーパークラスだ。Javaのプリミティブ型もScalaではオブジェクトになっている。

さらに List(1, 2.0, "3") とすると、List[Any] という型に推論される。Anyは、どんな型のオブジェクトも収められる、全てのオブジェクトのスーパークラスだ。

AnyRef というのがあり、それがJavaの java.lang.Object と同じ。Any は、AnyValAnyRef の共通のスーパークラス。



::: は2つのリストを連結する。List は不変オブジェクトなので、2つのリスト自体は変化しないが、連結された新しいリストを式の評価結果として返す。

:: は1つの要素をリストの先頭に追加する。:: で複数の要素を並べた場合、最後はリストでなければいけない。NilList() と同じで空のリストを表すので、最後に Nil を置けばよい。Lispのリストみたいだ。
val a = List("green", "red", "yellow", "orange");
val b = List("white", "blue");
a ::: b
// List("green", "red", "yellow", "orange", "white", "blue")
"rubik" :: b
// List("rubik", "white", "blue")
"rubik" :: "cube"
// 最後がリストでないので、コンパイルエラーになる
"rubik" :: "cube" :: Nil
// List("rubik", "cube")



リストの先頭に要素を追加するのは、リストの大きさに寄らず一定のコストで実行できるが、リストの最後に追加するのはリストの大きさに比例するコストがかかるらしい。ますますLispのリストと同じだ。



タプル。複数の値をコンマ区切りで並べて括弧で囲むと、タプルになる。_1, _2,,, というようなフィールド名で要素にアクセスできる。関数から複数の値を返すときに便利だそうだ。タプルはJavaにはない。
val t3 = (3, "abc", 3.14);
println(t3._1); // 3
println(t3._2); // abc
println(t3._3); // 3.14
タプルの要素は個々のフィールドなので、同じ型である必要はなく、t3Tuple3[Int, java.lang.String, Double] という型に推論される。



マップは Map を使う。これは Array と違い、List と同様にイミュータブルである。Map にキーバリューを追加するには、+ で2値のタプルを追加する。
// var m = Map[String, String]; // () がないとコンパイルエラー
var m = Map[String, String]();
m += ("a" -> "abc"); // m += (("a", "abc")) と同じ意味。
m += (("b", "bcd"), ("c", "cde"));
// Map("a" -> "abc", "b" -> "bcd", "c" -> "cde")
"a" -> "abc"-> というメソッドを呼び出していて、2値のタプルを返す。なので、m += ("a" -> "abc")m += (("a", "abc")) と同じ意味。



要素へのアクセスは List と同様に括弧を使う。要素が見つからなかった場合は、java.util.NoSuchElementException がスローされる。この仕様は、java.util.Map と同じ。
m("b") // "bcd"
m("d") // throw java.util.NoSuchElementException



2010/04/18追記
その5に続く
タグ:scala
カテゴリ:テック
2010/03/27 Sat 20:47 | Comment(0) | TrackBack(0) | テック | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
この記事へのトラックバックURL
http://blog.seesaa.jp/tb/144834906
※言及リンクのないトラックバックは受信されません。

この記事へのトラックバック
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。