はじめに
前回の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))
greetStrings
は val
で宣言している.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
0 件のコメント:
コメントを投稿