« 連載: Smalltalk use: better《26》これは要るけどこれは要らないかな★★ | トップページ | 連載: Smalltalk use: better《28》世界にひとつだけのはてな★★ »

2006年8月22日 (火)

連載: Smalltalk use: better《27》ここだけの話どこにでもある話★★

キーワード ◆ Array・at:・collect:・do:・inject:into:・Interval・OrderedCollection・reject:・select:・String・インスタンス変数・順序列・数列・配列・文字列

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

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

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

60822b_1

 

60822a_1

 

◆ ここで注目したいのは、メソッド do: を除く、他の4つの処理に関する記述が、特定の種類のコレクションに依存しないことです。これは、任意の種類のコレクションに対しても、これらの記述を再利用できることを意味します。すると、任意の種類に対して do: を規定するだけで、他の処理を再定義する必要がなくなります。つまり、メソッドを記述する手間を、1/5 に軽減できる可能性を秘めています。

◆ メソッド do: の記述から、同種のオブジェクト群に共通する構造が見えてきます。つまり、特定の種類のコレクションを構成する各要素を処理するときの、典型的な事例を学べます。◆

"String"
do := [:Self :aBlock |
    1 to: Self size do:
        [:index |
        aBlock value: (Self at: index)]].
s := 'ABC'.
Transcript show: s; cr.
do value: s value: [:e |
    Transcript show: e; space]
------------------------------ Transcript --
ABC
A B C

◆ クラス String で規定されたメソッド do: に相当する、ブロック do について考えます。すると、
 do value: s value: [:e | ...]
は、
 s do: [:e | ...]
に相当します。出力結果を見ると、各文字を空白で区切りながら、順に表示するのが分かります。

文字列を構成する各要素(文字)について、ブロック式を評価します。各要素を得るには、at: を使います。index の値は、1 から文字列の長さ(要素数)まで変化します。こうして、各文字について、ブロック式を評価します。

"Interval"
do := [:Self :aBlock |
    | start stop aValue |
    start := Self first.
    stop := Self last.
    aValue := start.
    [aValue <= stop]
        whileTrue:
            [aBlock value: aValue.
            aValue := aValue + 1]].
s := 1 to: 3.
Transcript show: s; cr.
do value: s value: [:e |
    Transcript show: e; space]
------------------------------ Transcript --
(1 to: 3)
1 2 3

◆ クラス Interval で規定されたメソッド do: に相当する、ブロック do について考えます。すると、
 do value: s value: [:e | ...]
は、
 s do: [:e | ...]
に相当します。各整数を空白で区切りながら、順に表示するのが分かります。

数列を構成する各要素(整数)について、ブロック式を評価します。各要素を得るには、aValue を使います。start は先頭の要素を、stop は末尾の要素を、それぞれ保持します。aValue に、start の値を初期設定します。aValue の値が stop の値以下なら、要素をたどるごとに、aValue の値が1つずつ増加します。すると、aValue の値は、start から stop まで変化します。こうして、各整数について、ブロック式を評価します。各要素を保持するのではなく、計算によって得ているのが分かります。

start および stop は、インスタンス変数を意識したものです。この他に、差分を表す step が存在します。

"OrderedCollection"
do := [:Self :aBlock |
    | array firstIndex lastIndex index |
    array := Self collector.
    firstIndex := 1.
    lastIndex := array size.
    index := firstIndex.
    [index <= lastIndex]
        whileTrue:
            [aBlock value: (array at: index).
            index := index + 1]].
s := 'ABC' asOrderedCollection.
Transcript show: s; cr.
do value: s value: [:e |
    Transcript show: e; space]
------------------------------ Transcript --
an OrderedCollection($A $B $C)
A B C

◆ クラス OrderedCollection で規定されたメソッド do: に相当する、ブロック do について考えます。すると、
 do value: s value: [:e | ...]
は、
 s do: [:e | ...]
に相当します。各文字を空白で区切りながら、順に表示するのが分かります。

順序列を構成する各要素(任意)について、ブロック式を評価します。各要素を得るには、at: を使います。array は、各要素を保持する配列を束縛します。firstIndex は先頭の位置を、lastIndex は末尾の位置を、それぞれ保持します。index に、firstIndex の値を初期設定します。index の値が lastIndex の値以下なら、要素をたどるごとに、index の値が1つずつ増加します。すると、index の値は、firstIndex から lastIndex まで変化します。こうして、各要素について、ブロック式を評価します。

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

60822c_1

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

|

« 連載: Smalltalk use: better《26》これは要るけどこれは要らないかな★★ | トップページ | 連載: Smalltalk use: better《28》世界にひとつだけのはてな★★ »

Squeak/Smalltalk」カテゴリの記事

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

コメント

コメントを書く



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




トラックバック


この記事へのトラックバック一覧です: 連載: Smalltalk use: better《27》ここだけの話どこにでもある話★★:

« 連載: Smalltalk use: better《26》これは要るけどこれは要らないかな★★ | トップページ | 連載: Smalltalk use: better《28》世界にひとつだけのはてな★★ »