« 連載: Smalltalk use: better《24》何処までが同じで何処からが違うの★★ | トップページ | 連載: Smalltalk use: better《26》これは要るけどこれは要らないかな★★ »

2006年8月18日 (金)

連載: Smalltalk use: better《25》これは要るけどこのほうがいいかな★★

キーワード ◆ collect:・do:・select:

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

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

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

s := 'ABCDE' asOrderedCollection.
Transcript show: s; cr.
s := s collect: [:e | e asciiValue].
Transcript show: s
------------------------------ Transcript --
an OrderedCollection($A $B $C $D $E)
an OrderedCollection(65 66 67 68 69)

60818acollect: を使うと、各要素でブロック式を評価した結果を要素とする、新たなコレクションが得られます。出力結果を見ると、文字列を構成する各文字の ASCII コードの値を要素とする、新たなコレクションが得られるのが分かります。

collect := [:Self :aBlock |
    | newCollection |
    newCollection := Self species new.
    Self do: [:each | newCollection
        add: (aBlock value: each)].
    newCollection].
s := 'ABCDE' asOrderedCollection.
s := collect value: s value: [:e | e asciiValue].
Transcript show: s
------------------------------ Transcript --
an OrderedCollection(65 66 67 68 69)

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

◆ ブロック変数 newCollection には、得られた結果を保持するコレクションを設定します。species を使って、生成するコレクションの種類を決定します。ブロック引数 Self が保持する各要素 each で、ブロック式 aBlock を評価します。そこで得られた要素を、newCollection に追加します。すべての要素を処理すると、最後に newCollection をリターンオブジェクトとします。

◆ ここで注目したいのは、実引数 Self が保持する各要素を参照する方法が、do: によって決定されることです。これは、collect: を実現する方法が、do: に依存するものの、特定の種類のオブジェクトには依存しないことを意味します。

s := 'ABCDE' asOrderedCollection.
Transcript show: s; cr.
s := s select: [:e | e isVowel].
Transcript show: s
------------------------------ Transcript --
an OrderedCollection($A $B $C $D $E)
an OrderedCollection($A $E)

60818bselect: を使うと、各要素でブロック式を評価して true となるものだけを要素とする、新たなコレクションが得られます。出力結果を見ると、文字列を構成する各文字が母音であるものだけを要素とする、新たなコレクションが得られるのが分かります。◆

select := [:Self :aBlock |
    | newCollection |
    newCollection := Self species new.
    Self do: [:each | (aBlock value: each)
        ifTrue: [newCollection add: each]].
    newCollection].
s := 'ABCDE' asOrderedCollection.
s := select value: s value: [:e | e isVowel].
Transcript show: s
------------------------------ Transcript --
an OrderedCollection($A $E)

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

◆ ブロック変数 newCollection には、得られた結果を保持するコレクションを設定します。species を使って、生成するコレクションの種類を決定します。ブロック引数 Self が保持する各要素 each で、ブロック式 aBlock を評価します。そこで true と評価された要素だけを、newCollection に追加します。すべての要素を処理すると、最後に newCollection をリターンオブジェクトとします。

◆ ここで注目したいのは、実引数 Self が保持する各要素を参照する方法が、do: によって決定されることです。これは、select: を実現する方法が、do: に依存するものの、特定の種類のオブジェクトには依存しないことを意味します。

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

|

« 連載: Smalltalk use: better《24》何処までが同じで何処からが違うの★★ | トップページ | 連載: Smalltalk use: better《26》これは要るけどこれは要らないかな★★ »

Squeak/Smalltalk」カテゴリの記事

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

コメント

コメントを書く



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




トラックバック


この記事へのトラックバック一覧です: 連載: Smalltalk use: better《25》これは要るけどこのほうがいいかな★★:

« 連載: Smalltalk use: better《24》何処までが同じで何処からが違うの★★ | トップページ | 連載: Smalltalk use: better《26》これは要るけどこれは要らないかな★★ »