« 連載: Smalltalk use: better《28》世界にひとつだけのはてな★★ | トップページ | 連載: Smalltalk use: better《30》私の辞書には不可能の文字もあるの★★ »

2006年8月24日 (木)

連載: Smalltalk use: better《29》並んで並んで赤白黄色きれいでしょ★★

キーワード ◆ add:・addAll:・addAllLast:・addFirst:・addLast:・OrderedCollection・順序列・両頭待ち行列

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

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

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

60824a ◆ クラス OrderedCollection は、要素の順序に意味のあるコレクションを管理します。これは、両頭待ち行列の概念を連想させます。
.

s := OrderedCollection new.
Transcript show: s; cr.
s addAll: 'ABC'.
Transcript show: s; cr.
s add: $D.
Transcript show: s; cr.
s addLast: $E.
Transcript show: s; cr.
s addFirst: $F.
Transcript show: s
------------------------------ Transcript --
an OrderedCollection()
an OrderedCollection($A $B $C)
an OrderedCollection($A $B $C $D)
an OrderedCollection($A $B $C $D $E)
an OrderedCollection($F $A $B $C $D $E)

◆ 変数 s は、生成した OrderedCollection のインスタンスを束縛します。出力結果を見ると、要素を持たない順序列を生成するのが分かります。addAll: を使うと、複数の要素を一度に追加できます。出力結果を見ると、3つの文字を要素に持つのが分かります。このとき、要素は、追加した順序と同じに並ぶのが分かります。add: を使うと、任意の要素を追加できます。出力結果を見ると、文字 $D を順序列の末尾に追加するのが分かります。addLast: を使うと、任意の要素を末尾に追加できます。出力結果を見ると、文字 $E を順序列の末尾に追加するのが分かります。addFirst: を使うと、任意の要素を先頭に追加できます。出力結果を見ると、文字 $F を順序列の先頭に追加するのが分かります。

add := [:Self :newObject |
    Self addLast: newObject].
addAllLast := [:Self :anOrderedCollection |
    anOrderedCollection do: [:each |
        Self addLast: each].
    anOrderedCollection].
addAll := [:Self :aCollection |
    addAllLast value: Self value: aCollection].
s := OrderedCollection new.
Transcript show: s; cr.
addAll value: s value: 'ABC'.
Transcript show: s; cr.
add value: s value: $D.
Transcript show: s
------------------------------ Transcript --
an OrderedCollection()
an OrderedCollection($A $B $C)
an OrderedCollection($A $B $C $D)

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

60824b ◆ ここで注目したいのは、addAll: を実現するときに addAllLast: を、addAllLast: を実現するときに addLast: を利用していることです。また、add: を実現するときに、addLast: を利用しています。これは、これらのメソッドによって得られる結果がすべて、addLast: に依存することを意味します。

makeRoomAtLast := [:array |
    | newArray |
    newArray := array species
        new: array size + 1.
    newArray
        replaceFrom: 1
        to: array size
        with: array
        startingAt: 1.
    array := newArray].
addLast := [:Self :newObject |
    | array lastIndex |
    array := Self collector.
    lastIndex := Self size.
    makeRoomAtLast value: array.
    array at: lastIndex + 1 put: newObject.
    Self setContents: array.
    newObject].
s := 'ABC' asOrderedCollection.
Transcript show: s; cr.
r := addLast value: s value: $E.
Transcript show: s; cr.
Transcript show: r
------------------------------ Transcript --
an OrderedCollection($A $B $C)
an OrderedCollection($A $B $C $E)
E

◆ クラス Set で規定されたメソッド addLast: に相当する、ブロック addLast について考えます。すると、
 addLast value: s value: $E
は、
 s addLast: $E
に相当します。出力結果を見ると、要素 $E を末尾に追加するのが分かります。

makeRoomAtFirst := [:array |
    | newArray |
    newArray := array species
        new: array size + 1.
    newArray
        replaceFrom: 2
        to: array size + 1
        with: array
        startingAt: 1.
    array := newArray].
addFirst := [:Self :newObject |
    | array firstIndex |
    array := Self collector.
    firstIndex := 1.
    makeRoomAtFirst value: array.
    array at: firstIndex put: newObject.
    Self setContents: array.
    newObject].
s := 'ABC' asOrderedCollection.
Transcript show: s; cr.
r := addFirst value: s value: $F.
Transcript show: s; cr.
Transcript show: r
------------------------------ Transcript --
an OrderedCollection($A $B $C)
an OrderedCollection($F $A $B $C)
F

◆ クラス Set で規定されたメソッド addFirst: に相当する、ブロック addFirst について考えます。すると、
 addFirst value: s value: $F
は、
 s addFirst: $F
に相当します。出力結果を見ると、要素 $F を先頭に追加するのが分かります。

◆ ブロック addLast および addFirst に共通する、array は、各要素を保持する配列を束縛します。lastIndex は、末尾の要素の位置を保持します。firstIndex は、先頭の要素の位置を保持します。

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

◆ ブロック makeRoomAtLast では、array が束縛する配列の末尾に、要素を追加する場所を確保します。ブロック makeRoomAtFirst では、array が束縛する配列の先頭に、要素を追加する場所を確保します。

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

|

« 連載: Smalltalk use: better《28》世界にひとつだけのはてな★★ | トップページ | 連載: Smalltalk use: better《30》私の辞書には不可能の文字もあるの★★ »

Squeak/Smalltalk」カテゴリの記事

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

コメント

コメントを書く



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




トラックバック


この記事へのトラックバック一覧です: 連載: Smalltalk use: better《29》並んで並んで赤白黄色きれいでしょ★★:

« 連載: Smalltalk use: better《28》世界にひとつだけのはてな★★ | トップページ | 連載: Smalltalk use: better《30》私の辞書には不可能の文字もあるの★★ »