« 連載: Smalltalk use: better《29》並んで並んで赤白黄色きれいでしょ★★ | トップページ | Shall_we_Agile = Java.use(better, Python) # Swing《1》Python/Jython はじめました〔改訂版〕★ »

2006年8月25日 (金)

連載: Smalltalk use: better《30》私の辞書には不可能の文字もあるの★★

キーワード ◆ Association・associationsDo:・at:・at:ifAbsent:・at:put:・collect:・Dictionary・do:・keysAndValuesDo:・keysDo:・select:・キー・辞書・写像・値

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

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

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

60825a ◆ クラス Dictionary は、任意のキーと値との対からなるコレクションを管理します。これは、写像の概念を連想させます。

s := Dictionary new.
Transcript show: s; cr.
s at: #B put: 2.
Transcript show: s; cr.
s at: #A put: 1.
Transcript show: s; cr.
s at: #C put: 3.
Transcript show: s
------------------------------ Transcript --
a Dictionary()
a Dictionary(#B->2 )
a Dictionary(#A->1 #B->2 )
a Dictionary(#A->1 #B->2 #C->3 )

◆ 変数 s は、生成した Dictionary のインスタンスを束縛します。出力結果を見ると、要素を持たない辞書を生成するのが分かります。at:put: を使うと、キーと値との写像対を要素として追加できます。出力結果を見ると、3つの写像対を要素に持つのが分かります。このとき、各要素が、追加した順序と関係なく並ぶのが分かります。

...
r := s at: #A.
Transcript show: r; cr.
r := s at: #X.
Transcript show: r; cr.
r := s at: #X ifAbsent: [0].
Transcript show: r
------------------------------ Transcript --
1
error: 'key not found'
0

at: を使うと、キーに対応する値が得られます。出力結果を見ると、シンボル #A をキーとする値が 1 となるのが分かります。at:ifAbsent: を使うと、キーが見つからないときに得られる値を指定できます。出力結果を見ると、シンボル #X をキーとする値が見つからないので、0 が得られるのが分かります。

...
s do: [:e | Transcript show: e; space].
Transcript cr.
s keysDo: [:e | Transcript show: e; space].
Transcript cr.
s keysAndValuesDo: [:key :value |
    Transcript show: key,': ',value asString; cr].
------------------------------ Transcript --
3 2 1
C B A
C: 3
B: 2
A: 1

do: を使うと、辞書に登録された値で、ブロック式を評価します。keysDo: を使うと、辞書に登録されたキーで、ブロック式を評価します。keysAndValuesDo: を使うと、辞書に登録されたキーと値で、ブロック式を評価します。

...
r := s collect: [:e | e * 10].
Transcript show: r; cr.
r := s select: [:e | e odd].
Transcript show: r
------------------------------ Transcript --
an OrderedCollection(30 20 10)
a Dictionary(#A->1 #C->3 )

collect: を使うと、辞書に登録された値で、ブロック式を評価した結果を要素とする、新たなコレクションが得られます。select: を使うと、辞書に登録された値で、ブロック式を評価して true となるものだけを要素とする、新たなコレクションが得られます。

collect := [:Self :aBlock |
    | newCollection |
    newCollection := OrderedCollection
        new: Self size.
    Self do: [:each | newCollection
        add: (aBlock value: each)].
    newCollection].
s := Dictionary new.
s at: #A put: 1.
s at: #B put: 2.
s at: #C put: 3.
r := collect value: s value: [:e | e * 10].
Transcript show: r
------------------------------ Transcript --
an OrderedCollection(30 20 10)

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

select := [:Self :aBlock |
    | newCollection |
    newCollection := Self species new.
    Self associationsDo: [:each |
        (aBlock value: each value)
        ifTrue: [newCollection add: each]].
    newCollection].
s := Dictionary new.
s at: #A put: 1.
s at: #B put: 2.
s at: #C put: 3.
r := select value: s value: [:e | e odd].
Transcript show: r
------------------------------ Transcript --
a Dictionary(#A->1 #C->3 )

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

60825b ◆ ここで注目したいのは、collect: を実現するときに do: を、select: を実現するときに associationsDo: を利用していることです。また、do: および associationsDo: を実現するときに、親クラスで規定された do: を利用しています。これは、これらのメソッドによって得られる結果がすべて、親クラスで規定された do: に依存することを意味します。

【課題】何をリターンするのか
Dictionary のキーには、任意のオブジェクトを利用できますが、例外があります。それは、何でしょう。

60825c ◆ このことから、Dictionary は、特殊な Set であることが想像できます。実際に、辞書 Dictionary は、写像対 Association を要素とする集合 Set と見なせます。

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

|

« 連載: Smalltalk use: better《29》並んで並んで赤白黄色きれいでしょ★★ | トップページ | Shall_we_Agile = Java.use(better, Python) # Swing《1》Python/Jython はじめました〔改訂版〕★ »

Squeak/Smalltalk」カテゴリの記事

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

コメント

コメントを書く



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




トラックバック


この記事へのトラックバック一覧です: 連載: Smalltalk use: better《30》私の辞書には不可能の文字もあるの★★:

« 連載: Smalltalk use: better《29》並んで並んで赤白黄色きれいでしょ★★ | トップページ | Shall_we_Agile = Java.use(better, Python) # Swing《1》Python/Jython はじめました〔改訂版〕★ »