第2回 メッセージによる制御構造1(4月20日)

今日の課題

■ コレクション(1)

複数のオブジェクトを束ね持つオブジェクトのことをコレクションという。 オブジェクトを順に並べて束ね持つ場合は「配列(Array)」を使い、C言語でも 良く使われる。順番に意味が無い場合は「Bag」というオブジェクトが便利で ある。

例題1

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)

■ インスタンス変数

例題2

1個以上の星の集りを表すクラス MyStars を作成しよう。このクラスは、 Bag のインスタンス stars に星を入れ、stars をインスタンス変数に持つ。 つまり、以下のように定義する。

■ ブロック

ブロックは、1個以上のステートメントを束ね持つオブジェクトである。 大括弧で1個以上のステートメントを囲むことで表記する。C言語で、ステー トメントを中括弧{ }で囲むことができるが、C言語は { }を順番になる と直に実行するが、Smalltalk では、動けと言われるまでは実行され ず、何度も実行することができる。

例題3

下記を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

■ 制御構造

プログラムの制御は、以下のメッセージを送ることで実現される。

例題4

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 ]

■ コレクション2

コレクションのテスト

たとえば、Bag に入っているものについて検査する。

コレクションへの操作

たとえば、Bag に入っているものの1個ずつについて何か操作する。

例題5

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]

例題6

偶数のみを 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]

□ 第1回小レポート

MyStars に、次に説明する機能を持つメソッド deleteAll を追加せよ。

  1. stars に入っている星の数を Transcript に表示する。
  2. stars に含まれる星を全て消す。
  3. 消去後は、stars に空の Bag のインスタンスを代入する。

提出する小レポートには、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」などのグラフィックツールを使って印刷する。

伝達事項

小レポートの採点後は,いったん返却します.返却されたレポートは各自 がファイルに綴じておいて下さい.最終レポートと同時にそのファイルを提出 してもらいます.その後,ファイルは返却しません.


2005.4.13 by tokuhisa