複数のオブジェクトを束ね持つオブジェクトのことをコレクションという。 オブジェクトを順に並べて束ね持つ場合は「配列(Array)」を使い、C言語でも 良く使われる。順番に意味が無い場合は「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)
1個以上の星の集りを表すクラス MyStars を作成しよう。このクラスは、 Bag のインスタンス stars に星を入れ、stars をインスタンス変数に持つ。 つまり、以下のように定義する。
Object subclass: #MyStars instanceVariableNames: 'stars' classVariableNames: '' poolDictionarys: '' category: 'MyObjects'
initialize stars := Bag new appear: pos stars add: (StarMorph new openInWorld position: pos)
実行は、Workspace 上で以下を行う。
x := MyStars new initialize. x appear: 300@300. x appear: 310@320. x appear: 320@290. x appear: 325@270
ブロックは、1個以上のステートメントを束ね持つオブジェクトである。 大括弧で1個以上のステートメントを囲むことで表記する。C言語で、ステー トメントを中括弧{ }で囲むことができるが、C言語は { }を順番になる と直に実行するが、Smalltalk では、動けと言われるまでは実行され ず、何度も実行することができる。
下記を1行ずつ評価してみよう。
x := MyStars new initialize (← ここを入力した後で Alt-d を押す) y := [ x appear: 200@200. x appear: 210@220 ] (← ここを入力した後で Alt-d を押す) y value (← ここを入力した後で Alt-d を押す) y value (← ここを入力した後で Alt-d を押す)
(ブロックには引数を渡すことができる。)
z := [: pos| x appear: (200 + pos)@(200 + pos). x appear: (210 + pos)@(220 + pos) ] z value: 50 z value: 150
プログラムの制御は、以下のメッセージを送ることで実現される。
ifTrue: の使用例
( 100 < 200 ) ifTrue: [ x appear: 100@400 ] ( 100 > 200 ) ifFalse: [ x appear: 100@420 ] ( 100 > 200 ) ifTrue: [ x appear: 100@450 ] ifFalse: [ x appear:400@100 ]
whileTrue: の使用例(whileTrue: の左側がブロックであることに注意)
i := 1. [ i < 10 ] whileTrue: [ x appear: 100@(i * 10 + 100). i := i + 1 ]
たとえば、Bag に入っているものについて検査する。
たとえば、Bag に入っているものの1個ずつについて何か操作する。
Bag に積めた星を全て消してみよう。
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). b do: [: s | s delete]
偶数のみを Transcript に表示しよう。
do: と ifTrue: を使う場合
#( 1 2 3 4 5 6 7 8 9 10 ) do: [: i | (i even) ifTrue: [Transcript show: i; cr]]
select: を使う場合
(#( 1 2 3 4 5 6 7 8 9 10 ) select: [: i | i even]) do: [: i | Transcript show: i; cr]
MyStars に、次に説明する機能を持つメソッド deleteAll を追加せよ。
提出する小レポートには、Workspace 上で以下を実行した結果、および、 System Browser 上に deleteAll を表示した状態の画面を印刷して提出するこ と。
a := MyStars new initialize. b := MyStars new initialize. c := [:man :pos :i | [ i > 0 ] whileTrue: [ man appear: (i * 20)@pos. i := i - 1 ] ]. c value: a value: 200 value: 10. c value: b value: 300 value: 10. a deleteAll
画面の取り込みは、Linux の画面の一番上のメニューバーの「アクション」 を選択し、「スクリーンショット」を選択する。すると、Screenshot.png と いうファイルが作られる。
画面の印刷は、「gimp」などのグラフィックツールを使って印刷する。
小レポートの採点後は,いったん返却します.返却されたレポートは各自 がファイルに綴じておいて下さい.最終レポートと同時にそのファイルを提出 してもらいます.その後,ファイルは返却しません.