« 連載: Smalltalk use: better《20》文字列と数列は何が違うの(2)★ | トップページ | 連載: Smalltalk use: better《22》誰が制御するのかな★★ »

2006年8月14日 (月)

連載: Smalltalk use: better《21》文字列と数列は何が違うの(3)★★

キーワード ◆ asArray・collect:・inject:into:・size・subStrings:・数列・文字列

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

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

◆ 余談ですが《19》の枕を補足しておきます。
◆ 0.9≠1.0 というのは明らかです。次のように、
0.9999999999999999999999999999999≠1.0
小数点以下に 9 をいくつ並べても、等号は成立しません。しかし、これが有限ではなく、無限に 9 を続けると、等号が成立するという性質があります。これには、いくつかの証明方法があります。たとえば、
0.999999999... = 1.0 … (1)
の両辺を十倍すると、
9.999999999... = 10.0 … (2)
となります。ここで、(2)-(1) を求めると、
9.000000000... = 9.0
両辺が等しくなることで、証明できます。

◆ それでも、騙されたような気がする人は、(1) の両辺を 3 で割ると、
0.333333333... = 1.0/3
となることで、納得できるでしょうか。

◆ 何か新しいことを学ぼうとするときに、思い込みや、すでに確立された常識が、その理解を妨げるという事例には、枚挙に暇がありません。みなさんの場合は、いかがですか。

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

s := '12345' asArray.
Transcript show: s
-------------------------------- Transcript --
#($1 $2 $3 $4 $5)

asArray を使うと、同じ構成要素を持つ配列が得られます。出力結果を見ると、文字列を構成する各文字を要素とする配列が得られるのが分かります。

s := (1 to: 5) asArray.
Transcript show: s
-------------------------------- Transcript --
#(1 2 3 4 5)

asArray を使うと、同じ構成要素を持つ配列が得られます。出力結果を見ると、数列を構成する各整数を要素とする配列が得られるのが分かります。

Transcript show: 'e: acc'; cr.
Transcript show: '-----------'; cr.
s := 1 to: 5.
r := s inject: '' into: [:acc :e |
    Transcript show: e asString, ': '.
    Transcript show: acc; cr.
    acc, e asString, ','].
Transcript show: '-----------'; cr.
Transcript show: r
-------------------------------- Transcript --
e: acc
-----------
1:
2: 1,
3: 1,2,
4: 1,2,3,
5: 1,2,3,4,
-----------
1,2,3,4,5,

inject:into: を使うと、各要素でブロック式を評価した結果を累積したものが得られます。ブロック引数 acc には、初期値として空文字列 '' を設定します。ブロック引数 e には、数列の各要素が順に割り当てられます。出力結果を見ると、acc の変化から、数列の各要素を ',' で接合した文字列が形成される様子が分かります。

s := '12345' asArray.
sum := s inject: 0 into: [:acc :e |
    acc + e asString].
Transcript show: sum
-------------------------------- Transcript --
15

◆ inject:into: を使って、数の総和を求めます。ブロック引数 acc には、初期値 0 を設定します。出力結果を見ると、1 から 5 までの総和が 15 となるのが分かります。+ を使うと、一方の文字列を数値と見なして、それを加算します。

s := 1 to: 5.
s := s collect: [:e | e asString].
Transcript show: s
-------------------------------- Transcript --
#('1' '2' '3' '4' '5')

collect: を使うと、各要素でブロック式を評価した結果を要素とする、新たなコレクションが得られます。出力結果を見ると、数列の各要素に相当する文字列を要素とする配列が得られます。asString を使うと、任意のオブジェクトを文字列に変換します。

s := 'AB,C,DEF' subStrings: ','.
Transcript show: s; cr.
s do: [:e |
    Transcript show: e; space]
-------------------------------- Transcript --
#('AB' 'C' 'DEF')
AB C DEF

subStrings: を使うと、引数に指定した文字列で分割した、部分文字列を要素とする配列が得られます。出力結果を見ると、',' の位置で分割した部分文字列が、配列の各要素となるのが分かります。そして、各要素を空白で区切りながら、順に表示するのが分かります。

size := [:Self |
    | tally |
    tally := 0.
    Self do: [:each | tally := tally + 1].
    tally].
s := 'ABC'.
r := size value: s.
Transcript show: r
-------------------------------- Transcript --
3

◆ 文字列に対して規定されたメソッド size に相当する、ブロック size について考えます。すると、
 size value: s
は、
 s size
に相当します。つまり、文字列 s にメッセージ size を送ると、文字列の長さ(要素数)が得られます。

60814a ◆ ブロック引数 Self は、実引数に指定された文字列を束縛します。ブロック変数 tally は、数え上げた要素数を保持します。これに、初期値 0 を設定します。ブロック引数 each は、文字列 Self を構成する各文字を束縛します。要素をたどるごとに、tally の値が1つずつ増加します。すると、tally が要素数と等しくなるので、これをリターンオブジェクトとします。出力結果を見ると、文字列 'ABC' の長さが 3 となるのが分かります。

size := [:Self |
    | start stop |
    start := Self first.
    stop := Self last.
    start < stop
        ifTrue: [stop - start + 1]
        ifFalse: [0]].
s := 1 to: 3.
r := size value: s.
Transcript show: r
-------------------------------- Transcript --
3

◆ 数列に対して規定されたメソッド size に相当する、ブロック size について考えます。すると、
 size value: s
は、
 s size
に相当します。つまり、数列 s にメッセージ size を送ると、数列の長さ(要素数)が得られます。

60814b ◆ ブロック引数 Self は、実引数に指定された数列を束縛します。ブロック変数 start に、先頭の値 Self first を設定します。ブロック変数 stop に、末尾の値 Self last を設定します。start < stop を満たすなら、要素数を計算して、これをリターンオブジェクトとします。start < stop を満たさないなら、0 をリターンオブジェクトとします。出力結果を見ると、数列 1 to: 3 の長さが 3 となるのが分かります。

◆ ここで注目したいのは、初期値と終了値を使って、要素を計算で求めていることです。つまり、実際には、size と同数の要素を保持してはいないのです。

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

|

« 連載: Smalltalk use: better《20》文字列と数列は何が違うの(2)★ | トップページ | 連載: Smalltalk use: better《22》誰が制御するのかな★★ »

Squeak/Smalltalk」カテゴリの記事

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

コメント

コメントを書く



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




トラックバック


この記事へのトラックバック一覧です: 連載: Smalltalk use: better《21》文字列と数列は何が違うの(3)★★:

« 連載: Smalltalk use: better《20》文字列と数列は何が違うの(2)★ | トップページ | 連載: Smalltalk use: better《22》誰が制御するのかな★★ »