複数のオブジェクトを束ね持つオブジェクトのことをコレクションという。オブジェクトを順に並べて束ね持つクラスには「配列(Array)」がある。順番に意味が無いクラスには「Bag」がある。
Bag に「星(StarMorph)」を3つ入れてみよう。Workspace上で以下を実行すればよい。
b := Bag new b add: (StarMorph new openInWorld position: 100@130) b add: (StarMorph new openInWorld position: 95@100) b add: (StarMorph new openInWorld position: 120@115)
次のメソッドにより、集めたオブジェクトの数や、特定のオブジェクトの有無について調べることができる。
Bag の場合、順序を問わず要素を追加することができる。
Array の場合、大きさや指定番目へのアクセスができる。
集めたオブジェクトの 1 つずつに対して、ブロックの処理をすることができる。
Bag に集めた星を全て消してみよう。
(例題1)を実行後の変数 b を使う。 b do: [: s | s delete]
Bag の中から取り出した1つのオブジェクトを、変数 s としている。
そのオブジェクトに対して delete のメッセージを送っている。
Workspace 上で操作をして、偶数のみを Transcript に表示しよう。
do: と ifTrue: を使う場合
a := #( 1 2 3 4 5 6 7 8 9 10 ) a do: [: i | ( i が偶数か調べる ) trueのオブジェクトに引数(ブロック)の処理をしてもらう ]
ヒント1:「i が偶数か調べる」方法は、数のオブジェクトに「even」というメッセージを送る。もし偶数ならば true オブジェクトが返され、そうでなければ false オブジェクトが返される。
ヒント2: Transcript show: i; cr とすると、表示した後、改行する。
Workspace 上で操作をして、偶数のみを Transcript に表示しよう。
select を使う場合
a := #( 1 2 3 4 5 6 7 8 9 10 ) b := a からselect:を使って偶数のみを抽出する b do: [: i | bの要素を1つずつ表示する]
ヒント1: select: の引数はブロック
ヒント2: ヒント1のブロックでは、要素iが偶数か調べるだけでよい。調べた結果が true の時、select: の返り値であるコレクションに、そのオブジェクトが入れられるからである。
練習1、2では、変数 a、b を使っていたが、オブジェクト指向プログラミングでは、作業用の変数を使わずにプログラムを作ることが多い。変数 a、b を使わないで、練習1、2と同等の動作をさせてみよう。
文字は、$記号を使って記述する。
a := $H b := $e c := $l d := $o Transcript show: a Transcript show: b Transcript show: c Transcript show: c Transcript show: d Transcript cr
文字列は、文字のコレクションである。
s := #( $H $e $l $l $o ) s do: [: c | Transcript show: c] Transcript cr Transcript show: s ; cr (←期待どおりには動かないだろう)
文字列を操作する際、コレクションであることを意識したプログラム(たとえば、上記のように do: を使う)は読みにくい。そこで、簡単に操作できるように、String クラスが用意されている。
System Browser の「カテゴリ」ペイン(ウインドウの左上)で、コントロールキーを押しながら、左クリックをすると、メニューが表示される。「find class (f)」を選択し、検索用のウインドウで、「String」と入力してみよう。
「文字列」という選択肢を選ぶと、「String」クラスの定義を参照することができる。
問1 Stringクラスのスーパークラスは何だろう?
問2 問1の答えとなるクラスのスーパークラスは何だろう?
種類の異なるオブジェクトでも、同じ名前のメソッドを持ち、その振舞いが共通しているとき、オブジェクトにメッセージを送る側から見ると、ある振舞いを期待しながら、オブジェクトの区別をせずに、メッセージを送ることができる。逆に言えば、同じメッセージを送っているにもかかわらず、受信側のオブジェクトごとに内部の処理が異なることがある。こうした性質をポリモーフィズムと呼ぶ。
1 から 10 までの整数を格納した Array を変数 a とせよ。
文字列インスタンス 'Tottori University' を変数 b とせよ。
1 から 100 までの偶数を格納した Bag を変数 c とせよ。
変数 a, b, c を格納した Bag を変数 d とせよ。
変数 d の各要素の大きさを Transcript に表示せよ(size というメッセージがポリモーフィズムのおかげで使えることに注意しよう)。
変数 a, b を格納した Bag を変数 e とせよ。
変数 e の各要素のさらに中で数えて 10 番目の要素を Transcript に表示せよ。