« 連載: Smalltalk use: better《27》ここだけの話どこにでもある話★★ | トップページ | 連載: Smalltalk use: better《29》並んで並んで赤白黄色きれいでしょ★★ »

2006年8月23日 (水)

連載: Smalltalk use: better《28》世界にひとつだけのはてな★★

キーワード ◆ add:・addAll:・do:・Set・union:・yourself・リターンオブジェクト・集合

※ PDF でご覧になるなら ⇒ 公開日まで、お待ちください。

------------ 序 ------------

------------ 本文 ------------

60823a ◆ クラス Set は、要素が重複しないコレクションを管理します。これは、集合の概念を連想させます。

.

s := Set new.
Transcript show: s; cr.
s add: $A.
Transcript show: s; cr.
s add: $A.
Transcript show: s; cr.
s add: $B.
Transcript show: s; cr
------------------------------ Transcript --
a Set()
a Set($A)
a Set($A)
a Set($B $A)

◆ 変数 s は、生成した Set のインスタンスを束縛します。出力結果を見ると、要素を持たない空集合を生成するのが分かります。add: を使うと、任意の要素を追加できます。出力結果を見ると、1つの文字 $A を要素に持つのが分かります。続けて、同じ文字 $A を追加しようとします。しかし、要素の重複は認められないので、文字 $A を追加できません。続けて、違う文字 $B を追加しようとします。すると、要素は重複しないので、文字 $B を追加します。出力結果を見ると、2つの文字を要素に持つのが分かります。

◆ ここで注目したいのは、要素を追加した順序が保持されないことです。出力結果を見ると、各要素が、追加した順序と関係なく並ぶのが分かります。これは、添字を使って要素を参照できないことを意味します。

s := Set new.
s addAll: 'ABBCCC'.
Transcript show: s; cr
------------------------------ Transcript --
a Set($B $C $A)

addAll: を使うと、複数の要素を一度に追加できます。出力結果を見ると、3つの文字を要素に持つのが分かります。このとき、要素は重複することなく、構成する文字の順序と関係なく並ぶのが分かります。

addAll := [:Self :aCollection |
    aCollection do: [:each |
        Self add: each].
    aCollection].
s := Set new.
Transcript show: s; cr.
addAll value: s value: 'ABC'.
Transcript show: s; cr
------------------------------ Transcript --
a Set()
a Set($B $C $A)

◆ クラス Collection で規定されたメソッド addAll: に相当する、ブロック addAll について考えます。すると、
 addAll value: s value: 'ABC'.
は、
 s addAll: 'ABC'.
に相当して、出力結果も同じになるのが分かります。

◆ ブロック引数 aCollection は、追加したい要素群を束縛します。aCollection が保持する各要素 each を、ブロック引数 Self が束縛する対象に追加します。すべての要素を処理すると、最後に aCollection をリターンオブジェクトとします。

60823b ◆ ここで注目したいのは、各要素を追加するときに、add: を利用していることです。これは、addAll: によって得られる結果が、add: に依存することを意味します。

tally および array は、インスタンス変数を意識したものです。

s := Set new.
s addAll: 'ABC'.
Transcript show: s; cr.
s do: [:e |
    Transcript show: e; space]
------------------------------ Transcript --
a Set($B $C $A)
B C A

do := [:Self :aBlock |
    | tally array |
    tally := Self size.
    array := Self array.
    1 to: array size do:
        [:index |
        | each |
        (each := array at: index)
            ifNotNil: [aBlock value: each]]].
s := 'ABC' asSet.
Transcript show: s; cr.
do value: s value: [:e |
    Transcript show: e; space]
------------------------------ Transcript --
a Set($A $B $C)
A B C

◆ クラス Set で規定されたメソッド do: に相当する、ブロック do について考えます。すると、
 do value: s value: [:e | ...]
は、
 s do: [:e | ...]
に相当して、出力結果も同じになるのが分かります。

集合を構成する各要素(任意)について、ブロック式を評価します。各要素 each を得るには、at: を使います。tally は、要素数を保持します。array は、各要素を保持する配列を束縛します。index の値は、1 から集合の要素数まで変化します。各要素 each が nil でないなら、それでブロック式を評価します。

【課題】何をリターンするのか
do: のリターンオブジェクトは、何でしょう。

s1 := 'AB' asSet.
s2 := 'BC' asSet.
s := s1 union: s2.
Transcript show: s1; cr.
Transcript show: s2; cr.
Transcript show: s
------------------------------ Transcript --
a Set($A $B)
a Set($B $C)
a Set($A $B $C)

union: を使うと、2つの集合の積集合(共通集合)が得られます。出力結果を見ると、2つの集合 s1 および s2 に共通する要素 $B を、1つだけ含むのが分かります。

union := [:Self :aCollection |
    Self copy addAll: aCollection; yourself].
s1 := 'AB' asSet.
s2 := 'BC' asSet.
s := union value: s1 value: s2.
Transcript show: s
------------------------------ Transcript --
a Set($A $B $C)

◆ クラス Set で規定されたメソッド union: に相当する、ブロック union について考えます。すると、
 union value: s1 value: s2
は、
 s1 union: s2
に相当して、出力結果も同じになるのが分かります。

◆ Self および aCollection は、積集合の対象となる各集合を束縛します。一方の集合 Self の複製を生成した後で、addAll: を使って、これに他方の集合 aCollection の各要素を追加します。yourself を記述しないと、リターンオブジェクトは、求める積集合ではなく、aCollection となるので、注意が必要です。

【課題】何が受け取るのか
メッセージ yourself の受け手は、何でしょう。

==================================
真樹育未 著 ◆ 監修:小泉ひよ子とタマゴ倶楽部

|

« 連載: Smalltalk use: better《27》ここだけの話どこにでもある話★★ | トップページ | 連載: Smalltalk use: better《29》並んで並んで赤白黄色きれいでしょ★★ »

Squeak/Smalltalk」カテゴリの記事

.連載: Smalltalk use: better」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック


この記事へのトラックバック一覧です: 連載: Smalltalk use: better《28》世界にひとつだけのはてな★★:

« 連載: Smalltalk use: better《27》ここだけの話どこにでもある話★★ | トップページ | 連載: Smalltalk use: better《29》並んで並んで赤白黄色きれいでしょ★★ »