今日はもう1つの復習をします。
もう前にやりましたが
リテラルと動的配列の違い についてです。
今回学ぶことは
リテラル配列はメッセージ送信で 作られるものではなく
動的配列は実行時にメッセージを使って 作られます。
しかし、どちらも Array クラスのインスタンスです。
配列を作るための方法が 2 つあるということです。
覚えているでしょうか
リテラル配列を作る構文は #( に続いて
テキスト形式のオブジェクトを 入れていきます。
この場合、整数 45 と 文字列「milou」と
数 1300と真偽値 true と
シンボル #tintin です。
このリテラルオブジェクトにクラスを 尋ねれば
Array のインスタンスだと答えます。
このリテラル配列の動的なバージョンが
これです。
動的配列を生成するには Array クラスを使って
with:with:with:with: メソッドで インスタンスを生成します。
メッセージをこれらを引数にして渡して
上のリテラル配列と等しい Array クラスのインスタンスを生成します。
オブジェクトを生成する方法が 2 つあるということです。
これはまた別のバージョンの 動的配列です。
Array クラスに new: メッセージを送って
配列を手動で作ることができます。
そして at:put: を使って 配列の内容を埋めていって
できあがった配列を返します。
これも動的配列を作るための さらにもう1つ別の方法です。
中括弧を使った
専用の構文糖衣を使うやり方です。
いいですか？
この中括弧を使って上に書いたのと 全く同じ配列を
より速くかつ明快に書くことができます。
できあがるものは同じです。
つまり、中括弧の中に
表現式を点（.）で区切って 入れておくと
それらの表現式が評価されて コレクションが作られます。
リテラル配列と
中括弧による動的配列の
大きな違いは
表現式として
例えば 12 に初期化された変数で
配列を作る時には リテラル配列の場合には #( に続いて
a + 1. 13
とすると、こんな配列になります。
つまり シンボル a と + と
整数 1 とシンボル . と整数13 から成る配列です。
動的配列で同じことをすると
a := 12 に続いて
{ a + 1. 13 } とすると
2 つの要素から成る配列が得られます。
要素は 13 と 13 です。
どういうことかというと
a + 1 が表現式として評価され
a は 12 で、それに + 1 そして次が 13
点（.）で区切られた各表現式が 評価されてから
配列が生成されます。
つまり、重要な違いは
中括弧を使うと 式が実行されて
#( を使ってリテラル配列をつくると
式は実行されません。
なぜかというと
リテラル配列を生成するのは
コンパイラだからです。
もう少し複雑な例があります。
#( に続いて
さらに内部で括弧を使います。 ここがポイントなのですが
リテラル配列の中で括弧を使うことで ネストしたリテラル配列を作ります。
このリテラル配列では 何も評価実行されません。
コンパイル時にコンパイラが作るからです。
ネストした配列を含む配列が 1 つできます。
ここにあるように
1 つ目のネスト配列の内容は
10 とシンボル @ と整数 20 などです。
その証拠に この配列の 1 番目の要素を取り出すと
この配列が得られます。
リテラル配列の中で括弧を使うと
ネストした配列ができます。
重要なことは
Pharo では配列は 1 種類しかないということです。
Array クラスのインスタンスです。
しかし配列を生成する方法は色々あります。
1 つ目の方法はリテラル構文 #( です。
この場合、配列はコンパイル時に コンパイラが生成することに注意してください。
動的な方法で簡単なのは Array new: です。
new: メッセージを Array クラスに送ります。
構文的にコンパクトな動的な方法は
中括弧を使って表現式を点で区切って
それぞれ評価して配列を生成します。