2013年3月23日土曜日

Scalaのお勉強 第2回:「Scalaプログラミングの次の一歩」(前編)


はじめに




前回のScalaの記事から,1ヶ月半ほど経ってしまいました.

今回はコップ本の第3章「Scalaプログラミングの次の一歩」を読んだので,記事を書きます.

この第3章,内容をブログにまとめようとすると,結構な量になってきたので,記事を2つに分けようと思います.









パラメータ化




パラメータ化 = "生成するインスタンスの「構成を設定する」こと"

Javaで言えば,オブジェクトを作る時に,コンストラクタへ引数を渡すのと同じ(?)




val greetStrings = new Array[String](4)


上の例では, Array[String] 型のオブジェクトに (4) とすることで,長さ4の配列であると構成を設定している.

greetStrings の型が Array[String] であるのもポイント.









型コンストラクタ




Array は型コンストラクタと呼ばれるもの.

型コンストラクタに型変数を与えることによって,初めて型として成り立つ.

関数にいくつかの引数を与えて,値になるようなイメージで型を作る仕組み.

Haskellにもあった概念だと思う.









valで宣言した配列の書き換え







val greetStrings = new Array[String](4)    

greetStrings(0) = "Hello"
greetStrings(1) = ", "
greetStrings(2) = "world"
greetStrings(3) = "!\n"

for(i <- 0 to 2)
print(greetStrings(i))



greetStringsval で宣言している.

val で宣言したものは,再代入できない.

ところが,上記のコード例のように, greetStrings の要素には代入できる.

なぜなら, greetStrings の要素への代入しても, greetStrings には再代入していないためである.

もちろん, greetStrings = greetStirngs2 のような,再代入はできない.

これをCのポインタでいうと,ポインタ変数に格納しているアドレスは書き換えられないけど,ポインタが指す先にあるデータ領域は書き換えられる,ということである.

Cのコードで書くとこうなる.







char *const str1 = (char*)malloc(sizeof(char)*4);
char *str2 = (char*)malloc(sizeof(char)*4);

strcpy(str1, "ABC");
strcpy(str2, "DEF");

str1[1] = 'G'; //OK
str1 = str2; //Error








さまざまな糖衣構文




先ほど示したScalaのコード例の中には,様々な糖衣構文が存在する.


  • 0 to 2(0).to(2) の糖衣構文.


  • greetStrings(i)greetString.apply(i) の糖衣構文.


  • greetStrings(1) = "Hello" greetStrings.update(1, "Hello") の糖衣構文.


  • 1 + 2(1).+(2) の糖衣構文.




このように,さまざまなものが,メソッド呼び出しに変換される糖衣構文(syntax suger)である.






おわりに




今回はコップ本の第3章「Scalaプログラミングの次の一歩」を読んだまとめ(前編)を書きました.

後編はいつになることか…

あんまりがっつり書くと時間がかかるので,次回からもう少しはしょりながら書こうかと思ってます.




--
My Emacs Files At GitHub