WEBVTT

00:00:00.960 --> 00:00:05.160 align:middle
このコースでは
Pharo のコレクションの階層の

00:00:05.320 --> 00:00:07.600 align:middle
要点について学びます。

00:00:07.760 --> 00:00:11.760 align:middle
Pharo には沢山の種類のコレクションが
あることがわかるでしょう。

00:00:11.920 --> 00:00:14.960 align:middle
プログラマを楽にしてくれます。

00:00:15.120 --> 00:00:17.360 align:middle
同じ API を共有しているので。

00:00:17.520 --> 00:00:22.720 align:middle
また、リテラルなコレクションと動的なものの
違いについても見てみます。

00:00:23.960 --> 00:00:28.720 align:middle
コレクションには多くの種類があるので
その API は多種多様ですが

00:00:28.880 --> 00:00:32.360 align:middle
よく整理された共通 API を共有しているので

00:00:32.520 --> 00:00:34.880 align:middle
プログラマを楽にしてくれます。

00:00:35.440 --> 00:00:37.880 align:middle
Pharo 特有なことは

00:00:38.040 --> 00:00:41.000 align:middle
最初の要素のインデックスが 1 だと
いうことです。

00:00:41.160 --> 00:00:43.560 align:middle
0 になっている他の言語と違って。

00:00:44.280 --> 00:00:47.880 align:middle
Pharo では、コレクションは
どんな種類のオブジェクトも格納できます。

00:00:48.040 --> 00:00:50.840 align:middle
他の言語では必ずしもそうではありません。

00:00:51.440 --> 00:00:55.240 align:middle
最も素晴らしく、また、広く使われている
コレクションをいくつか見てみましょう。

00:00:55.400 --> 00:00:57.960 align:middle
OrderedCollection は
動的なコレクションで

00:00:58.120 --> 00:01:02.160 align:middle
要素を追加するごとに大きくなっていきます。

00:01:02.320 --> 00:01:05.560 align:middle
Array は固定長のコレクションです。

00:01:05.720 --> 00:01:09.200 align:middle
インデックスを使って要素にアクセスできます。

00:01:09.360 --> 00:01:13.280 align:middle
Set は要素を重複なく格納します。

00:01:13.440 --> 00:01:16.200 align:middle
同じ要素を2度追加することはできません。

00:01:16.360 --> 00:01:21.160 align:middle
Dictionary はハッシュテーブルです。
1つのキーに対して1つの値が関連付けられています。

00:01:22.040 --> 00:01:24.840 align:middle
これはコレクションの階層からの抜粋です。

00:01:25.000 --> 00:01:28.160 align:middle
抜粋にすぎません。
Pharo にあるものはもっと大きいです。

00:01:28.320 --> 00:01:31.240 align:middle
沢山のクラスがあります。
どのコレクションも全コレクション共通の

00:01:31.400 --> 00:01:34.120 align:middle
API を持っています。

00:01:34.880 --> 00:01:39.160 align:middle
このコースでは
それらの API を太字で示します。

00:01:40.480 --> 00:01:44.240 align:middle
7つの共通 API があります。

00:01:44.400 --> 00:01:49.240 align:middle
クラスに送られる
コレクション(creation)生成メソッド

00:01:49.400 --> 00:01:52.120 align:middle
コレクションの特性にアクセスする
(accessing)メソッド

00:01:52.280 --> 00:01:54.840 align:middle
（コレクションのサイズや

00:01:55.000 --> 00:01:57.840 align:middle
格納されている要素など）

00:01:58.000 --> 00:02:00.920 align:middle
コレクションを検査する(testing)メソッド
（コレクションは空か？）

00:02:01.080 --> 00:02:05.320 align:middle
要素を追加(adding)したり取り除く(removing)
メソッドや列挙する(enumerating)メソッド

00:02:05.480 --> 00:02:11.400 align:middle
（要素の一覧を見たり
ある要素が格納されているかを見たり）

00:02:11.560 --> 00:02:15.920 align:middle
そしてコレクションを別の種類のものへ
変換する(converting)メソッド

00:02:16.760 --> 00:02:20.640 align:middle
例題から始めて見ましょう。
Pharo でコレクションを作りたいとします。

00:02:20.800 --> 00:02:24.120 align:middle
単に、興味のあるクラスを選んで

00:02:24.280 --> 00:02:28.040 align:middle
new メッセージを送ることで
そのクラスのインスタンスを生成します。

00:02:28.200 --> 00:02:30.360 align:middle
1つめの選択肢では new を使います。

00:02:30.520 --> 00:02:33.720 align:middle
2つめの選択肢では、直接 new は使いません。

00:02:33.880 --> 00:02:36.360 align:middle
コレクションの大きさを指定したいとします。

00:02:36.520 --> 00:02:41.440 align:middle
new: 4 を送ることができます。
大きさが 4 や 2 の配列を作ります。

00:02:41.600 --> 00:02:45.720 align:middle
このやり方は OrderedCollection でも使えます。
大きさ 1000 のものを作ることができます。

00:02:47.400 --> 00:02:51.920 align:middle
初期化済みのコレクションを作るメソッドもあります。

00:02:52.080 --> 00:02:53.520 align:middle
例えば withAll: です。

00:02:53.680 --> 00:02:58.360 align:middle
リテラルのコレクションを渡します。
リテラルのコレクションは #( で始まります。

00:02:59.120 --> 00:03:02.480 align:middle
要素を渡して、それが全て格納されているような

00:03:02.640 --> 00:03:06.760 align:middle
OrderedCollection の新しいインスタンスを作ります。

00:03:07.600 --> 00:03:09.360 align:middle
Set でも同じことができます。

00:03:09.520 --> 00:03:12.760 align:middle
Set では重複した要素を持つことはできません。

00:03:12.920 --> 00:03:16.640 align:middle
リテラルのコレクションでは
7 が 2 回現れますが

00:03:16.800 --> 00:03:19.000 align:middle
Set の中では 2 つ持つことはできません。

00:03:21.200 --> 00:03:25.680 align:middle
他にも初期化のために

00:03:25.840 --> 00:03:27.920 align:middle
クラスに送ることができるメッセージが
いくつかあります。

00:03:28.080 --> 00:03:31.600 align:middle
new:withAll: もその例です。

00:03:31.760 --> 00:03:33.880 align:middle
大きさが 5 で

00:03:34.040 --> 00:03:37.360 align:middle
全ての要素が特定のオブジェクトであるような
コレクションが欲しい、ということです。

00:03:37.520 --> 00:03:40.000 align:middle
この場合、文字列 a です。

00:03:42.240 --> 00:03:46.400 align:middle
Pharo では全てのコレクションで
インデックスが 1 から始まることを覚えておいてください。

00:03:46.560 --> 00:03:49.480 align:middle
この 3 要素からなるコレクションに

00:03:49.640 --> 00:03:53.440 align:middle
インデックス 2 の要素を返してもらうと
これが返ってきます。

00:03:53.600 --> 00:03:56.000 align:middle
これは 1、これは 2、これは 3 です。

00:03:56.760 --> 00:03:58.960 align:middle
OrderedCollection でも同じです。

00:03:59.120 --> 00:04:02.480 align:middle
このコレクションを変換して
インデックス 2 を返してもらうと

00:04:02.640 --> 00:04:04.560 align:middle
hates が得られます。

00:04:05.840 --> 00:04:09.960 align:middle
コレクションにはあらゆる種類のオブジェクトを
格納することができます。

00:04:10.120 --> 00:04:12.280 align:middle
その例をお見せしましょう。

00:04:12.440 --> 00:04:16.920 align:middle
このリテラルのコレクションは
文字列 calvin と

00:04:17.080 --> 00:04:22.000 align:middle
数 1 と 2 と 3 を格納したコレクション
を格納しています。

00:04:22.160 --> 00:04:23.960 align:middle
配列を作ることができます。

00:04:24.120 --> 00:04:28.360 align:middle
この配列は要素 1 2 と、そして

00:04:29.360 --> 00:04:32.600 align:middle
集合 (Set) から成っています。

00:04:33.360 --> 00:04:37.160 align:middle
要素 1 をここで
そして要素 2、そして集合を追加しました。

00:04:37.920 --> 00:04:41.160 align:middle
例えば do: メッセージを使って

00:04:41.320 --> 00:04:43.800 align:middle
コレクションの要素の一覧を見ることができます。

00:04:44.600 --> 00:04:46.400 align:middle
このコレクションに

00:04:47.400 --> 00:04:51.080 align:middle
do: メッセージを送って
ブロックを渡します。

00:04:51.720 --> 00:04:56.920 align:middle
ブロックは [ で始まって
] で終わります。

00:04:57.080 --> 00:05:00.720 align:middle
ブロックの引数は :each です。

00:05:00.880 --> 00:05:03.240 align:middle
引数はブロックの本体から
| で区切られています。

00:05:03.400 --> 00:05:07.200 align:middle
ループの各回で、each の値は
ブロックの要素を 1 つ目

00:05:07.360 --> 00:05:08.800 align:middle
そして 2 つ目、等となっていきます。

00:05:08.960 --> 00:05:12.440 align:middle
そしてトランスクリプトに
Calvin hates Suzie と表示されます。

00:05:14.480 --> 00:05:18.120 align:middle
配列は固定長のコレクションです。

00:05:18.280 --> 00:05:22.280 align:middle
配列に size メッセージを送ることで
大きさを問い合わせることができます。

00:05:22.440 --> 00:05:26.440 align:middle
at: メッセージを送ることで
配列の要素に直接アクセスできます。

00:05:26.600 --> 00:05:28.120 align:middle
2 つ目の要素が欲しいと。

00:05:28.280 --> 00:05:31.640 align:middle
コレクションの要素を変更することができます

00:05:31.800 --> 00:05:35.160 align:middle
at: 1 put: 'Calvin' を送ることで

00:05:35.680 --> 00:05:38.400 align:middle
1番目のセルに文字列 Calvin を入れます。

00:05:39.160 --> 00:05:41.040 align:middle
大きさを尋ねることもできます。

00:05:41.200 --> 00:05:44.600 align:middle
この例で興味深いことは

00:05:44.760 --> 00:05:47.800 align:middle
同じ配列が 2 通りの方法で
作られていることです。

00:05:47.960 --> 00:05:51.720 align:middle
最初のはリテラルのバージョンで
そして動的なバージョンです。

00:05:51.880 --> 00:05:56.360 align:middle
ここで、自分でArray クラスから
インスタンスを生成して

00:05:56.520 --> 00:05:58.120 align:middle
全てのセルを埋めます。

00:05:59.440 --> 00:06:03.200 align:middle
コレクションに size を送ることで
その大きさを知ることができます。

00:06:03.360 --> 00:06:07.600 align:middle
コレクションの要素に at: メソッドを使って
アクセスすることができます。

00:06:07.760 --> 00:06:09.200 align:middle
これはもう言いましたね。

00:06:10.480 --> 00:06:12.480 align:middle
注意してください。

00:06:12.640 --> 00:06:16.000 align:middle
インデックスを示して
要素にアクセスする時には

00:06:16.160 --> 00:06:18.400 align:middle
必ずインデックスがコレクションの境界内に
あることを確認しなければなりません。

00:06:18.560 --> 00:06:23.400 align:middle
インデックスはコレクションの大きさよりも
小さくなければなりません。

00:06:23.560 --> 00:06:27.720 align:middle
もしコレクションに、
存在しないインデックス 55 の要素を

106 align:middle
00:06:27,880 --> 00:06:30,400
返すように言ったら
エラーが返ってきます。

00:06:33.360 --> 00:06:35.480 align:middle
このコレクションのインデックス 2 に

00:06:35.640 --> 00:06:40.120 align:middle
新しい要素を入れたいとします。

00:06:40.280 --> 00:06:43.960 align:middle
文字列 love が
文字列 hates の代わりに入ります。

00:06:44.120 --> 00:06:46.200 align:middle
結果を見ればおわかりでしょう。

00:06:48.800 --> 00:06:52.080 align:middle
リテラルの配列です。

00:06:52.240 --> 00:06:55.400 align:middle
これはリテラルの配列の例です。

00:06:55.560 --> 00:06:57.840 align:middle
前に言った通り、#( で始まります。

00:06:58.000 --> 00:07:01.520 align:middle
中にはなんでも入ります。
数や文字列などなど

00:07:02.360 --> 00:07:05.160 align:middle
Pharo ではリテラルの配列は

00:07:05.320 --> 00:07:07.840 align:middle
デフォルトで Array クラスのインスタンスです。

00:07:08.000 --> 00:07:10.960 align:middle
リテラル配列に class メッセージを送ると

00:07:11.120 --> 00:07:14.920 align:middle
Array が返ってきます。
Array クラスのインスタンスということです。

00:07:18.800 --> 00:07:22.400 align:middle
動的な配列とリテラル配列は
Pharo では同じものです。

00:07:22.560 --> 00:07:26.440 align:middle
リテラル配列は単純に短くかけます。
より速く書くことができます。

00:07:26.600 --> 00:07:29.760 align:middle
ここにはリテラルの配列があります。

00:07:29.920 --> 00:07:33.760 align:middle
そして Array クラスのインスタンスを生成した
動的なバージョンがあります。

00:07:33.920 --> 00:07:37.240 align:middle
それらは同じ結果が得られるので
等しいものです。

00:07:40.000 --> 00:07:43.560 align:middle
OrderedCollectionクラスは
拡大することができる

00:07:43.720 --> 00:07:45.600 align:middle
コレクションを定義します。

00:07:45.760 --> 00:07:48.640 align:middle
要素を追加すると、大きくなります。

00:07:49.280 --> 00:07:53.320 align:middle
new メッセージを送ることで
OrderedCollection を生成します。

00:07:53.480 --> 00:07:57.040 align:middle
add: メソッドを使って
このコレクションに新しい要素を加えます。

00:07:57.200 --> 00:08:01.280 align:middle
addFirst: を使ってコレクションの
先頭に要素を追加することもできます。

00:08:01.440 --> 00:08:03.080 align:middle
デフォルトでは末尾に追加されます。

00:08:04.400 --> 00:08:07.600 align:middle
コレクションが何を返すかを見てください。

00:08:07.760 --> 00:08:11.440 align:middle
3つの要素から成っています。
Pharo、 Reef、そして Pharo です。

00:08:11.600 --> 00:08:15.400 align:middle
add: 'Seaside'で
末尾に 'Seaside' が追加されます。

00:08:17.760 --> 00:08:21.520 align:middle
変換 (conversion) メソッドで
異なる種類のコレクションに変換することができます。

00:08:21.680 --> 00:08:26.160 align:middle
ここでリテラルのコレクションがあります。
配列です。

00:08:26.320 --> 00:08:30.440 align:middle
asOrderedCollection メッセージは
この配列を

00:08:30.600 --> 00:08:32.600 align:middle
OrderedCollection に変換します。

00:08:33.520 --> 00:08:37.200 align:middle
Set は重複のないコレクションです。

00:08:37.360 --> 00:08:41.600 align:middle
Set は拡大することができます。
要素を追加するたびに大きくなります。

00:08:41.760 --> 00:08:45.560 align:middle
リテラルのコレクションを使って
そこから Set に変換できます。

00:08:45.720 --> 00:08:49.080 align:middle
重複のない Set が最終的に得られます。

00:08:49.880 --> 00:08:53.400 align:middle
リテラルではなく動的なやり方を
選択することもできます。

00:08:53.560 --> 00:08:57.720 align:middle
Set with: with: は集合を作って
2つの要素を入れます。

00:08:57.880 --> 00:08:59.440 align:middle
それぞれの要素が集合になっています。

00:09:02.000 --> 00:09:06.640 align:middle
変換メソッドは、ある種類のコレクションを
別の種類に変換するのに便利です。

00:09:06.800 --> 00:09:11.280 align:middle
as に欲しいコレクションの名前を付けたものです。

00:09:13.840 --> 00:09:17.000 align:middle
Dictionaryはキーと値のコレクションです。

00:09:17.160 --> 00:09:19.280 align:middle
キーと値を関連付けます。

00:09:19.440 --> 00:09:22.760 align:middle
Dictionary は拡大することができます。
要素を追加するごとに大きくなります。

00:09:22.920 --> 00:09:25.560 align:middle
Dictionaryについては

00:09:25.720 --> 00:09:28.360 align:middle
他のコレクションにないような
API があります。

00:09:28.520 --> 00:09:32.120 align:middle
よくある at: メッセージに加えて
at:ifAbsent: メッセージ

00:09:32.280 --> 00:09:37.200 align:middle
(アクセスしたいキーが存在していなかった時に
どうするか？です）

00:09:37.360 --> 00:09:42.160 align:middle
at:put: はキーに新しい値を入れます。

00:09:42.320 --> 00:09:47.520 align:middle
列挙する時によく使う do: メッセージも
使うことができますが

00:09:47.680 --> 00:09:49.080 align:middle
他のメッセージも使えます。

00:09:49.240 --> 00:09:52.640 align:middle
keysDo: はその辞書の全てのキーを一覧します。

00:09:52.800 --> 00:09:54.280 align:middle
keys や values もあります。

00:09:54.440 --> 00:09:58.240 align:middle
例えば、Dictuionary クラスの
インスタンスを生成します。

00:09:59.040 --> 00:10:03.360 align:middle
辞書を配列のように思い描いてみてください。

00:10:03.520 --> 00:10:08.040 align:middle
January をキーとして、31 を関連付けて
Februaryをキーとして28

00:10:08.200 --> 00:10:10.160 align:middle
Marchをキーとして31と。

00:10:12.840 --> 00:10:16.280 align:middle
これは動的なコレクションと等価です。

00:10:16.440 --> 00:10:21.480 align:middle
{ と } を使って動的なコレクションを

00:10:21.640 --> 00:10:23.720 align:middle
作ることができます。

00:10:23.880 --> 00:10:26.640 align:middle
関連を作るためには
矢印を使います。

00:10:26.800 --> 00:10:29.000 align:middle
これはシンボルです。

00:10:29.160 --> 00:10:33.080 align:middle
シンボル January に数 31 を関連付けます。

00:10:33.240 --> 00:10:35.720 align:middle
関連のコレクションがあります。

00:10:35.880 --> 00:10:38.440 align:middle
これを asDictionary で
Dictionaryに変換します。

00:10:38.600 --> 00:10:42.840 align:middle
辞書を生成するこれら2つの方法は等価です。

00:10:45.480 --> 00:10:48.280 align:middle
関連付けにキーを問い合わせれば

00:10:48.440 --> 00:10:50.760 align:middle
そのキーが返ってきます。
最初のほうです。

00:10:50.920 --> 00:10:52.400 align:middle
同じです。

00:10:52.560 --> 00:10:56.400 align:middle
関連付けに値を問い合わせれば
その値を返します。

00:10:56.560 --> 00:10:58.760 align:middle
これがペアであり関連付けです。

00:11:00.560 --> 00:11:01.760 align:middle
辞書について。

00:11:01.920 --> 00:11:06.080 align:middle
辞書の特定の値にアクセスしたい場合には

00:11:06.240 --> 00:11:11.600 align:middle
at: を使って、値を知りたいキーを指定します。

00:11:11.760 --> 00:11:13.800 align:middle
もしキーが存在しなければ

00:11:14.360 --> 00:11:17.720 align:middle
代わりにエラーが得られます。

00:11:18.560 --> 00:11:23.000 align:middle
それを避けるためには
at:ifAbsent: を使うことができます。

00:11:23.160 --> 00:11:26.600 align:middle
at: に続いて辞書中にないキーを書きます。

00:11:26.760 --> 00:11:30.720 align:middle
なければ、この値、0 を返します。

00:11:31.480 --> 00:11:35.040 align:middle
このキーはこの辞書に入っていないので
0 が返ってきます。

00:11:35.200 --> 00:11:40.480 align:middle
辞書の中を列挙することができます。
do: を使うと

00:11:40.640 --> 00:11:45.280 align:middle
辞書の値のみを得ることになります。
キーは得られません。

00:11:45.440 --> 00:11:48.800 align:middle
なぜか疑問に思うかもしれません。
とても奇妙です。

00:11:48.960 --> 00:11:50.720 align:middle
しかし実際にはとても合理的です。

00:11:50.880 --> 00:11:55.560 align:middle
もし Dictionary での do: の実装を見れば

00:11:55.720 --> 00:11:58.760 align:middle
何があるかというと
^ self valuesDo: です。

00:11:58.920 --> 00:12:01.480 align:middle
デフォルトでは、辞書に do: を適用すると

00:12:01.640 --> 00:12:04.080 align:middle
キーではなく値だけを一覧します。

00:12:05.440 --> 00:12:07.040 align:middle
もし両方とも一覧したければ

00:12:07.200 --> 00:12:10.680 align:middle
それ用のメソッド keysAndValuesDo: を
使わなければなりません。

00:12:10.840 --> 00:12:15.120 align:middle
keysAndValuesDo: は :k と :y の
2 つの引数をとるブロックを取ります。

00:12:15.280 --> 00:12:18.680 align:middle
:k はキーで v: は値です。

00:12:19.360 --> 00:12:22.160 align:middle
この辞書には中身が詰まっています。

00:12:23.880 --> 00:12:26.720 align:middle
このコースでは

00:12:26.880 --> 00:12:30.520 align:middle
Pharo には沢山の種類のコレクションが
利用できることを学びました。

00:12:31.160 --> 00:12:33.800 align:middle
コレクションには共通の語彙があります。

00:12:33.960 --> 00:12:35.720 align:middle
生成すること

00:12:35.880 --> 00:12:38.760 align:middle
要素にアクセスすること
サイズなど

00:12:38.920 --> 00:12:41.080 align:middle
プログラマーを楽にしてくれます。

00:12:41.240 --> 00:12:44.560 align:middle
コレクションを他の種類に
簡単に変換することができます。

00:12:44.720 --> 00:12:46.600 align:middle
他にも、もっと学びました。

00:12:46.760 --> 00:12:50.800 align:middle
何かわからないことがあったら
システムの中を見ることはとても簡単です。

208 align:middle
00:12:50,960 --> 00:12:54,960
Pharo の中身、クラスのコードを読んで
コレクションの他のクラスを学ぶことができます。

