高卒文系Scala vol.6 - 配列の初期化 -


Scala本、3.1辺りを読んでのアウトプット。



この節のタイトルは「配列を型でパラメーター化する」となっていますが、

「配列の初期化」の方がまっさきに頭に入れといた方がいいな、と思いました。


前回とほぼ同じですが、配列を利用して以下の文字列を標準出力するコードを例にします。

Don't think, feel.


物凄く冗長な例から挙げていきたいと思います。


val messages = new Array[String](3)
messages.update(0, "Don't ")
messages.update(1, "think, ")
messages.update(2, "feel. \n")
for (i <- (0).to(2)) print(messages.apply(i))


Scalaの配列は、Javaとは違って「Arrayクラスのインスタンス」という、れっきとしたオブジェクトとして表現されます。


Javaでの配列の要素アクセスの場合、messages[0]などという記述になるのですが、

messages[0]の [] の部分に相応するのが、Array#updateやArray#applyです。

Scalaでの配列の要素アクセスは、言語仕様に独特の記述を使うのではなく、メソッドを使う、という事ですね。


Javaでは配列の要素に値を格納するときも取り出すときも同じ方法でしたが、

Scalaはメソッドを呼び出して配列の要素にアクセスするので、値を格納するときと取得するときの呼び出し方法が違います。


Array#updateは、第一引数のインデックスの場所に、第二引数の値を格納するメソッドです。

Array#applyは、引数していされたインデックスの場所の要素を取得するメソッドです。



標準出力している方法に、Scala本の例通り、for式を使ってみました。

「(0).to(2)」の箇所は、「0」のInt#toに「2」を引数で渡して実行する、という意味です。


Scalaでは、Javaのようにプリミティブかラッパーかを意識する必要はありません。全てがオブジェクトとして表現されます。

ラッパークラスは、コンパイル時に可能な限りJavaのプリミティブに変換される為、実行時のパフォーマンスに影響を与える事もないそうです。


また、ScalaにはJavaの演算子と等価なモノはありません。Scalaでは、演算子さえもメソッドです。


・・・ここら辺の詳細は追求すると本題忘れるので、ここら辺でスルーするとしますw


「(0).to(2)」はシーケンスを返すとか、それはひとまず置いといて、

「単純にこう書けば、for文っぽい事ができる」って解釈で現段階では良しとします。させて下さいw



先に挙げた例は、冗長過ぎて分かりにくいですよね。

ちょっとだけ簡潔に記述した例を挙げます。


val messages = new Array[String](3)
messages(0) = "Don't "
messages(1) = "think, "
messages(2) = "feel. \n"
for (i <- 0 to 2) print(messages(i))

Array#updateとArray#applyが無くなってすっきりしました。

「あれ、結局はJavaとほぼ同じじゃね?」と初めは思いましたが、中身はそうじゃありませんでした。


「messages(0) = “Don’t "」の箇所は、「messages.update(0, "Don’t ”)」に、

「messages(i)」の箇所は、「messages.apply(i)」に内部で置換されています。


これは配列に限った事では無く、一般原則らしいのですが、ここではやっぱりスルー。

「配列のupdate、applyは簡単に書けるよ!」という認識で、今は十分そうです。


「(0).to(2)」も「0 to 2」と、簡単に書けます。


今まで「.」を使ってメソッド呼び出しをした例ばかりでしたが、

メソッド呼び出しのレシーバーが明示的を指定した場合、メソッド呼び出しに「.」や「()」が必要ありません。



まだ冗長です。もっと簡単に書いてみましょう。


val messages = Array.apply("Don't ", "think, ", "feel. \n")
for (i <- 0 to 2) print(messages(i))

この「Array.apply」はさっきの「apply」メソッドと違い、配列を返すFactory Methodです。

このメソッドは、可変長の引数と取ります。

Arrayコンパニオンオブジェクトで定義されているらしいですが、またまたスルー。4章で出てくるらしいです。


さらに、この「Array.apply」」も省略できます。


val messages = Array("Don't ", "think, ", "feel. \n")
for (i <- 0 to 2) print(messages(i))

Javaの「new String[]{“Don’t ”, “think, ”, “feel. \n”}」みたいな記述ですね。

だいぶスッキリしました。



前回、今回と続いて、たかだか要素数3の配列を標準出力する、という物凄く簡単な例を試してみました。

総合して、現段階で一番簡潔な書き方は以下のような感じになると思います。


Array("Don't ", "think, ", "feel. \n").foreach(print)


Scala本を読み続けるにつれ、段々と言葉で説明するのが難しくなってきましたw

次の節は、Scalaの肝である「List」です。

本当に理解できているか不安です・・・

このエントリーをはてなブックマークに追加
comments powered by Disqus