﻿1
00:00:00,960 --> 00:00:05,160
このコースでは
Pharo のコレクションの階層の

2
00:00:05,320 --> 00:00:07,600
要点について学びます。

3
00:00:07,760 --> 00:00:11,760
Pharo には沢山の種類のコレクションが
あることがわかるでしょう。

4
00:00:11,920 --> 00:00:14,960
プログラマを楽にしてくれます。

5
00:00:15,120 --> 00:00:17,360
同じ API を共有しているので。

6
00:00:17,520 --> 00:00:22,720
また、リテラルなコレクションと動的なものの
違いについても見てみます。

7
00:00:23,960 --> 00:00:28,720
コレクションには多くの種類があるので
その API は多種多様ですが

8
00:00:28,880 --> 00:00:32,360
よく整理された共通 API を共有しているので

9
00:00:32,520 --> 00:00:34,880
プログラマを楽にしてくれます。

10
00:00:35,440 --> 00:00:37,880
Pharo 特有なことは

11
00:00:38,040 --> 00:00:41,000
最初の要素のインデックスが 1 だと
いうことです。

12
00:00:41,160 --> 00:00:43,560
0 になっている他の言語と違って。

13
00:00:44,280 --> 00:00:47,880
Pharo では、コレクションは
どんな種類のオブジェクトも格納できます。

14
00:00:48,040 --> 00:00:50,840
他の言語では必ずしもそうではありません。

15
00:00:51,440 --> 00:00:55,240
最も素晴らしく、また、広く使われている
コレクションをいくつか見てみましょう。

16
00:00:55,400 --> 00:00:57,960
OrderedCollection は
動的なコレクションで

17
00:00:58,120 --> 00:01:02,160
要素を追加するごとに大きくなっていきます。

18
00:01:02,320 --> 00:01:05,560
Array は固定長のコレクションです。

19
00:01:05,720 --> 00:01:09,200
インデックスを使って要素にアクセスできます。

20
00:01:09,360 --> 00:01:13,280
Set は要素を重複なく格納します。

21
00:01:13,440 --> 00:01:16,200
同じ要素を2度追加することはできません。

22
00:01:16,360 --> 00:01:21,160
Dictionary はハッシュテーブルです。
1つのキーに対して1つの値が関連付けられています。

23
00:01:22,040 --> 00:01:24,840
これはコレクションの階層からの抜粋です。

24
00:01:25,000 --> 00:01:28,160
抜粋にすぎません。
Pharo にあるものはもっと大きいです。

25
00:01:28,320 --> 00:01:31,240
沢山のクラスがあります。
どのコレクションも全コレクション共通の

26
00:01:31,400 --> 00:01:34,120
API を持っています。

27
00:01:34,880 --> 00:01:39,160
このコースでは
それらの API を太字で示します。

28
00:01:40,480 --> 00:01:44,240
7つの共通 API があります。

29
00:01:44,400 --> 00:01:49,240
クラスに送られる
コレクション(creation)生成メソッド

30
00:01:49,400 --> 00:01:52,120
コレクションの特性にアクセスする
(accessing)メソッド

31
00:01:52,280 --> 00:01:54,840
（コレクションのサイズや

32
00:01:55,000 --> 00:01:57,840
格納されている要素など）

33
00:01:58,000 --> 00:02:00,920
コレクションを検査する(testing)メソッド
（コレクションは空か？）

34
00:02:01,080 --> 00:02:05,320
要素を追加(adding)したり取り除く(removing)
メソッドや列挙する(enumerating)メソッド

35
00:02:05,480 --> 00:02:11,400
（要素の一覧を見たり
ある要素が格納されているかを見たり）

36
00:02:11,560 --> 00:02:15,920
そしてコレクションを別の種類のものへ
変換する(converting)メソッド

37
00:02:16,760 --> 00:02:20,640
例題から始めて見ましょう。
Pharo でコレクションを作りたいとします。

38
00:02:20,800 --> 00:02:24,120
単に、興味のあるクラスを選んで

39
00:02:24,280 --> 00:02:28,040
new メッセージを送ることで
そのクラスのインスタンスを生成します。

40
00:02:28,200 --> 00:02:30,360
1つめの選択肢では new を使います。

41
00:02:30,520 --> 00:02:33,720
2つめの選択肢では、直接 new は使いません。

42
00:02:33,880 --> 00:02:36,360
コレクションの大きさを指定したいとします。

43
00:02:36,520 --> 00:02:41,440
new: 4 を送ることができます。
大きさが 4 や 2 の配列を作ります。

44
00:02:41,600 --> 00:02:45,720
このやり方は OrderedCollection でも使えます。
大きさ 1000 のものを作ることができます。

45
00:02:47,400 --> 00:02:51,920
初期化済みのコレクションを作るメソッドもあります。

46
00:02:52,080 --> 00:02:53,520
例えば withAll: です。

47
00:02:53,680 --> 00:02:58,360
リテラルのコレクションを渡します。
リテラルのコレクションは #( で始まります。

48
00:02:59,120 --> 00:03:02,480
要素を渡して、それが全て格納されているような

49
00:03:02,640 --> 00:03:06,760
OrderedCollection の新しいインスタンスを作ります。

50
00:03:07,600 --> 00:03:09,360
Set でも同じことができます。

51
00:03:09,520 --> 00:03:12,760
Set では重複した要素を持つことはできません。

52
00:03:12,920 --> 00:03:16,640
リテラルのコレクションでは
7 が 2 回現れますが

53
00:03:16,800 --> 00:03:19,000
Set の中では 2 つ持つことはできません。

54
00:03:21,200 --> 00:03:25,680
他にも初期化のために

55
00:03:25,840 --> 00:03:27,920
クラスに送ることができるメッセージが
いくつかあります。

56
00:03:28,080 --> 00:03:31,600
new:withAll: もその例です。

57
00:03:31,760 --> 00:03:33,880
大きさが 5 で

58
00:03:34,040 --> 00:03:37,360
全ての要素が特定のオブジェクトであるような
コレクションが欲しい、ということです。

59
00:03:37,520 --> 00:03:40,000
この場合、文字列 a です。

60
00:03:42,240 --> 00:03:46,400
Pharo では全てのコレクションで
インデックスが 1 から始まることを覚えておいてください。

61
00:03:46,560 --> 00:03:49,480
この 3 要素からなるコレクションに

62
00:03:49,640 --> 00:03:53,440
インデックス 2 の要素を返してもらうと
これが返ってきます。

63
00:03:53,600 --> 00:03:56,000
これは 1、これは 2、これは 3 です。

64
00:03:56,760 --> 00:03:58,960
OrderedCollection でも同じです。

65
00:03:59,120 --> 00:04:02,480
このコレクションを変換して
インデックス 2 を返してもらうと

66
00:04:02,640 --> 00:04:04,560
hates が得られます。

67
00:04:05,840 --> 00:04:09,960
コレクションにはあらゆる種類のオブジェクトを
格納することができます。

68
00:04:10,120 --> 00:04:12,280
その例をお見せしましょう。

69
00:04:12,440 --> 00:04:16,920
このリテラルのコレクションは
文字列 calvin と

70
00:04:17,080 --> 00:04:22,000
数 1 と 2 と 3 を格納したコレクション
を格納しています。

71
00:04:22,160 --> 00:04:23,960
配列を作ることができます。

72
00:04:24,120 --> 00:04:28,360
この配列は要素 1 2 と、そして

73
00:04:29,360 --> 00:04:32,600
集合 (Set) から成っています。

74
00:04:33,360 --> 00:04:37,160
要素 1 をここで
そして要素 2、そして集合を追加しました。

75
00:04:37,920 --> 00:04:41,160
例えば do: メッセージを使って

76
00:04:41,320 --> 00:04:43,800
コレクションの要素の一覧を見ることができます。

77
00:04:44,600 --> 00:04:46,400
このコレクションに

78
00:04:47,400 --> 00:04:51,080
do: メッセージを送って
ブロックを渡します。

79
00:04:51,720 --> 00:04:56,920
ブロックは [ で始まって
] で終わります。

80
00:04:57,080 --> 00:05:00,720
ブロックの引数は :each です。

81
00:05:00,880 --> 00:05:03,240
引数はブロックの本体から
| で区切られています。

82
00:05:03,400 --> 00:05:07,200
ループの各回で、each の値は
ブロックの要素を 1 つ目

83
00:05:07,360 --> 00:05:08,800
そして 2 つ目、等となっていきます。

84
00:05:08,960 --> 00:05:12,440
そしてトランスクリプトに
Calvin hates Suzie と表示されます。

85
00:05:14,480 --> 00:05:18,120
配列は固定長のコレクションです。

86
00:05:18,280 --> 00:05:22,280
配列に size メッセージを送ることで
大きさを問い合わせることができます。

87
00:05:22,440 --> 00:05:26,440
at: メッセージを送ることで
配列の要素に直接アクセスできます。

88
00:05:26,600 --> 00:05:28,120
2 つ目の要素が欲しいと。

89
00:05:28,280 --> 00:05:31,640
コレクションの要素を変更することができます

90
00:05:31,800 --> 00:05:35,160
at: 1 put: 'Calvin' を送ることで

91
00:05:35,680 --> 00:05:38,400
1番目のセルに文字列 Calvin を入れます。

92
00:05:39,160 --> 00:05:41,040
大きさを尋ねることもできます。

93
00:05:41,200 --> 00:05:44,600
この例で興味深いことは

94
00:05:44,760 --> 00:05:47,800
同じ配列が 2 通りの方法で
作られていることです。

95
00:05:47,960 --> 00:05:51,720
最初のはリテラルのバージョンで
そして動的なバージョンです。

96
00:05:51,880 --> 00:05:56,360
ここで、自分でArray クラスから
インスタンスを生成して

97
00:05:56,520 --> 00:05:58,120
全てのセルを埋めます。

98
00:05:59,440 --> 00:06:03,200
コレクションに size を送ることで
その大きさを知ることができます。

99
00:06:03,360 --> 00:06:07,600
コレクションの要素に at: メソッドを使って
アクセスすることができます。

100
00:06:07,760 --> 00:06:09,200
これはもう言いましたね。

101
00:06:10,480 --> 00:06:12,480
注意してください。

102
00:06:12,640 --> 00:06:16,000
インデックスを示して
要素にアクセスする時には

103
00:06:16,160 --> 00:06:18,400
必ずインデックスがコレクションの境界内に
あることを確認しなければなりません。

104
00:06:18,560 --> 00:06:23,400
インデックスはコレクションの大きさよりも
小さくなければなりません。

105
00:06:23,560 --> 00:06:27,720
もしコレクションに、
存在しないインデックス 55 の要素を


106
00:06:27,880 --> 00:06:30,400
返すように言ったら
エラーが返ってきます。

107
00:06:33,360 --> 00:06:35,480
このコレクションのインデックス 2 に

108
00:06:35,640 --> 00:06:40,120
新しい要素を入れたいとします。

109
00:06:40,280 --> 00:06:43,960
文字列 love が
文字列 hates の代わりに入ります。

110
00:06:44,120 --> 00:06:46,200
結果を見ればおわかりでしょう。

111
00:06:48,800 --> 00:06:52,080
リテラルの配列です。

112
00:06:52,240 --> 00:06:55,400
これはリテラルの配列の例です。

113
00:06:55,560 --> 00:06:57,840
前に言った通り、#( で始まります。

114
00:06:58,000 --> 00:07:01,520
中にはなんでも入ります。
数や文字列などなど

115
00:07:02,360 --> 00:07:05,160
Pharo ではリテラルの配列は

116
00:07:05,320 --> 00:07:07,840
デフォルトで Array クラスのインスタンスです。

117
00:07:08,000 --> 00:07:10,960
リテラル配列に class メッセージを送ると

118
00:07:11,120 --> 00:07:14,920
Array が返ってきます。
Array クラスのインスタンスということです。

119
00:07:18,800 --> 00:07:22,400
動的な配列とリテラル配列は
Pharo では同じものです。

120
00:07:22,560 --> 00:07:26,440
リテラル配列は単純に短くかけます。
より速く書くことができます。

121
00:07:26,600 --> 00:07:29,760
ここにはリテラルの配列があります。

122
00:07:29,920 --> 00:07:33,760
そして Array クラスのインスタンスを生成した
動的なバージョンがあります。

123
00:07:33,920 --> 00:07:37,240
それらは同じ結果が得られるので
等しいものです。

124
00:07:40,000 --> 00:07:43,560
OrderedCollectionクラスは
拡大することができる

125
00:07:43,720 --> 00:07:45,600
コレクションを定義します。

126
00:07:45,760 --> 00:07:48,640
要素を追加すると、大きくなります。

127
00:07:49,280 --> 00:07:53,320
new メッセージを送ることで
OrderedCollection を生成します。

128
00:07:53,480 --> 00:07:57,040
add: メソッドを使って
このコレクションに新しい要素を加えます。

129
00:07:57,200 --> 00:08:01,280
addFirst: を使ってコレクションの
先頭に要素を追加することもできます。

130
00:08:01,440 --> 00:08:03,080
デフォルトでは末尾に追加されます。

131
00:08:04,400 --> 00:08:07,600
コレクションが何を返すかを見てください。

132
00:08:07,760 --> 00:08:11,440
3つの要素から成っています。
Pharo、 Reef、そして Pharo です。

133
00:08:11,600 --> 00:08:15,400
add: 'Seaside'で
末尾に 'Seaside' が追加されます。

134
00:08:17,760 --> 00:08:21,520
変換 (conversion) メソッドで
異なる種類のコレクションに変換することができます。

135
00:08:21,680 --> 00:08:26,160
ここでリテラルのコレクションがあります。
配列です。

136
00:08:26,320 --> 00:08:30,440
asOrderedCollection メッセージは
この配列を

137
00:08:30,600 --> 00:08:32,600
OrderedCollection に変換します。

138
00:08:33,520 --> 00:08:37,200
Set は重複のないコレクションです。

139
00:08:37,360 --> 00:08:41,600
Set は拡大することができます。
要素を追加するたびに大きくなります。

140
00:08:41,760 --> 00:08:45,560
リテラルのコレクションを使って
そこから Set に変換できます。

141
00:08:45,720 --> 00:08:49,080
重複のない Set が最終的に得られます。

142
00:08:49,880 --> 00:08:53,400
リテラルではなく動的なやり方を
選択することもできます。

143
00:08:53,560 --> 00:08:57,720
Set with: with: は集合を作って
2つの要素を入れます。

144
00:08:57,880 --> 00:08:59,440
それぞれの要素が集合になっています。

145
00:09:02,000 --> 00:09:06,640
変換メソッドは、ある種類のコレクションを
別の種類に変換するのに便利です。

146
00:09:06,800 --> 00:09:11,280
as に欲しいコレクションの名前を付けたものです。

147
00:09:13,840 --> 00:09:17,000
Dictionaryはキーと値のコレクションです。

148
00:09:17,160 --> 00:09:19,280
キーと値を関連付けます。

149
00:09:19,440 --> 00:09:22,760
Dictionary は拡大することができます。
要素を追加するごとに大きくなります。

150
00:09:22,920 --> 00:09:25,560
Dictionaryについては

151
00:09:25,720 --> 00:09:28,360
他のコレクションにないような
API があります。

152
00:09:28,520 --> 00:09:32,120
よくある at: メッセージに加えて
at:ifAbsent: メッセージ

153
00:09:32,280 --> 00:09:37,200
(アクセスしたいキーが存在していなかった時に
どうするか？です）

154
00:09:37,360 --> 00:09:42,160
at:put: はキーに新しい値を入れます。

155
00:09:42,320 --> 00:09:47,520
列挙する時によく使う do: メッセージも
使うことができますが

156
00:09:47,680 --> 00:09:49,080
他のメッセージも使えます。

157
00:09:49,240 --> 00:09:52,640
keysDo: はその辞書の全てのキーを一覧します。

158
00:09:52,800 --> 00:09:54,280
keys や values もあります。

159
00:09:54,440 --> 00:09:58,240
例えば、Dictuionary クラスの
インスタンスを生成します。

160
00:09:59,040 --> 00:10:03,360
辞書を配列のように思い描いてみてください。

161
00:10:03,520 --> 00:10:08,040
January をキーとして、31 を関連付けて
Februaryをキーとして28

162
00:10:08,200 --> 00:10:10,160
Marchをキーとして31と。

163
00:10:12,840 --> 00:10:16,280
これは動的なコレクションと等価です。

164
00:10:16,440 --> 00:10:21,480
{ と } を使って動的なコレクションを

165
00:10:21,640 --> 00:10:23,720
作ることができます。

166
00:10:23,880 --> 00:10:26,640
関連を作るためには
矢印を使います。

167
00:10:26,800 --> 00:10:29,000
これはシンボルです。

168
00:10:29,160 --> 00:10:33,080
シンボル January に数 31 を関連付けます。

169
00:10:33,240 --> 00:10:35,720
関連のコレクションがあります。

170
00:10:35,880 --> 00:10:38,440
これを asDictionary で
Dictionaryに変換します。

171
00:10:38,600 --> 00:10:42,840
辞書を生成するこれら2つの方法は等価です。

172
00:10:45,480 --> 00:10:48,280
関連付けにキーを問い合わせれば

173
00:10:48,440 --> 00:10:50,760
そのキーが返ってきます。
最初のほうです。

174
00:10:50,920 --> 00:10:52,400
同じです。

175
00:10:52,560 --> 00:10:56,400
関連付けに値を問い合わせれば
その値を返します。

176
00:10:56,560 --> 00:10:58,760
これがペアであり関連付けです。

177
00:11:00,560 --> 00:11:01,760
辞書について。

178
00:11:01,920 --> 00:11:06,080
辞書の特定の値にアクセスしたい場合には

179
00:11:06,240 --> 00:11:11,600
at: を使って、値を知りたいキーを指定します。

180
00:11:11,760 --> 00:11:13,800
もしキーが存在しなければ

181
00:11:14,360 --> 00:11:17,720
代わりにエラーが得られます。

182
00:11:18,560 --> 00:11:23,000
それを避けるためには
at:ifAbsent: を使うことができます。

183
00:11:23,160 --> 00:11:26,600
at: に続いて辞書中にないキーを書きます。

184
00:11:26,760 --> 00:11:30,720
なければ、この値、0 を返します。

185
00:11:31,480 --> 00:11:35,040
このキーはこの辞書に入っていないので
0 が返ってきます。

186
00:11:35,200 --> 00:11:40,480
辞書の中を列挙することができます。
do: を使うと

187
00:11:40,640 --> 00:11:45,280
辞書の値のみを得ることになります。
キーは得られません。

188
00:11:45,440 --> 00:11:48,800
なぜか疑問に思うかもしれません。
とても奇妙です。

189
00:11:48,960 --> 00:11:50,720
しかし実際にはとても合理的です。

190
00:11:50,880 --> 00:11:55,560
もし Dictionary での do: の実装を見れば

191
00:11:55,720 --> 00:11:58,760
何があるかというと
^ self valuesDo: です。

192
00:11:58,920 --> 00:12:01,480
デフォルトでは、辞書に do: を適用すると

193
00:12:01,640 --> 00:12:04,080
キーではなく値だけを一覧します。

194
00:12:05,440 --> 00:12:07,040
もし両方とも一覧したければ

195
00:12:07,200 --> 00:12:10,680
それ用のメソッド keysAndValuesDo: を
使わなければなりません。

196
00:12:10,840 --> 00:12:15,120
keysAndValuesDo: は :k と :y の
2 つの引数をとるブロックを取ります。

197
00:12:15,280 --> 00:12:18,680
:k はキーで v: は値です。

198
00:12:19,360 --> 00:12:22,160
この辞書には中身が詰まっています。

199
00:12:23,880 --> 00:12:26,720
このコースでは

200
00:12:26,880 --> 00:12:30,520
Pharo には沢山の種類のコレクションが
利用できることを学びました。

201
00:12:31,160 --> 00:12:33,800
コレクションには共通の語彙があります。

202
00:12:33,960 --> 00:12:35,720
生成すること

203
00:12:35,880 --> 00:12:38,760
要素にアクセスすること
サイズなど

204
00:12:38,920 --> 00:12:41,080
プログラマーを楽にしてくれます。

205
00:12:41,240 --> 00:12:44,560
コレクションを他の種類に
簡単に変換することができます。

206
00:12:44,720 --> 00:12:46,600
他にも、もっと学びました。

207
00:12:46,760 --> 00:12:50,800
何かわからないことがあったら
システムの中を見ることはとても簡単です。


208
00:12:50,960 --> 00:12:54,960
Pharo の中身、クラスのコードを読んで
コレクションの他のクラスを学ぶことができます。
