« 連載: Smalltalk use: better《23》何を制御するのかな★ | トップページ | 連載: Smalltalk use: better《25》これは要るけどこのほうがいいかな★★ »

2006年8月17日 (木)

連載: Smalltalk use: better《24》何処までが同じで何処からが違うの★★

キーワード ◆ do:・inject:into:・カプセル化・隠蔽・属性値

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

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

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

timesRepeat := [:Self :aBlock |
    | count |
    count := 1.
    [count <= Self]
        whileTrue:
            [aBlock value.
            count := count + 1]].
timesRepeat value: 3 value: [
    Transcript show: $A]
------------------------------ Transcript --
AAA

◆ クラス Integer で規定されたメソッド timesRepeat: に相当する、ブロック timesRepeat について考えます。すると、
 timesRepeat value: 3 value: [...]
は、
 3 timesRepeat: [...]
に相当します。つまり、指定した回数だけ、ブロック式を評価します。出力結果を見ると、文字 $A を3回続けて表示するのが分かります。

60817a ◆ ブロック変数 count は、ブロック式 aBlock を評価した回数を管理するもので、初期値 1 を設定します。count の値が、ブロック引数 Self の値以下なら、aBlock を評価 value するとともに、count の値を1つ増加させます。すると、指定した Self の回数だけ、aBlock を評価します。

todo := [:Self :stop :aBlock |
    | aValue |
    aValue := Self.
    [aValue <= stop]
        whileTrue:
            [aBlock value: aValue.
            aValue := aValue + 1]].
todo value: 1 value: 3 value: [:e |
    Transcript show: e; space]
------------------------------ Transcript --
1 2 3

◆ クラス Number で規定されたメソッド to:do: に相当する、ブロック todo について考えます。すると、
 todo value: 1 value: 3 value: [:e | ...]
は、
 1 to: 3 do: [:e | ...]
に相当します。つまり、指定した範囲の数に対して、ブロック式を評価します。出力結果を見ると、各整数を空白で区切りながら、順に表示するのが分かります。

60817b ◆ ブロック変数 aValue は、ブロック式 aBlock を評価するときの値を管理するもので、初期値にブロック引数 Self を設定します。aValue の値が、ブロック引数 stop の値以下なら、aBlock を評価 value: aValue するとともに、aValue の値を1つ増加させます。すると、Self から stop までの各値に対して、aBlock を評価します。

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.
do value: s value: [:e |
    Transcript show: e; space]
------------------------------ Transcript --
1 2 3

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

60817c ◆ ブロック引数 Self は、対象となる数列を束縛します。ブロック変数 start に、数列の初期値を設定します。ブロック変数 stop に、数列の終了値を設定します。ブロック変数 aValue は、ブロック式 aBlock を評価するときの値を管理するもので、初期値 start を設定します。aValue の値が、stop の値以下なら、aBlock を評価 value: aValue するとともに、aValue の値を1つ増加させます。すると、start から stop までの各値に対して、aBlock を評価します。

◆ これらに共通するのは、timesRepeat: におけるブロック変数 count、to:do: および do: におけるブロック変数 aValue など、カウンター変数を、メソッドの利用者が用意する必要がないことです。すると、カプセル化によって情報隠蔽を実現できます。利用者は、些末なカウンターの処理から解放され、本質的な処理だけをブロック内に記述して、後はメソッドに委ねればいいのです。

◆ timesRepeat: に伴うブロック式では不要ですが、to:do: および do: に伴うブロック式では、ブロック引数が必要になります。この引数は、ブロック変数 aValue によって、メソッド内で管理されます。

60817d ◆ これらのメソッドは、変数などの違いを除くと、本質的には同じです。そのため、もっとも汎用性のある do: から、他のメソッドを導出できます。そこには、初期値および終了値を決定するのが、メッセージの受信者か、送信者かの違いがあるだけです。

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

|

« 連載: Smalltalk use: better《23》何を制御するのかな★ | トップページ | 連載: Smalltalk use: better《25》これは要るけどこのほうがいいかな★★ »

Squeak/Smalltalk」カテゴリの記事

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

コメント

コメントを書く



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




トラックバック


この記事へのトラックバック一覧です: 連載: Smalltalk use: better《24》何処までが同じで何処からが違うの★★:

« 連載: Smalltalk use: better《23》何を制御するのかな★ | トップページ | 連載: Smalltalk use: better《25》これは要るけどこのほうがいいかな★★ »