WEBVTT

00:00:00.440 --> 00:00:05.120 align:middle
このビデオでは、Pharo の講義では
あまりカバーされないことを説明します。

00:00:05.320 --> 00:00:08.040 align:middle
可変長のオブジェクトを
定義する方法です。

00:00:09.360 --> 00:00:13.760 align:middle
お気付きでしょうが、我々はもう既に
サイズが異なるオブジェクトを使っています。

00:00:13.920 --> 00:00:18.040 align:middle
この表現式で配列を作ります。

00:00:18.240 --> 00:00:21.680 align:middle
10 個の要素を持っていて
いずれも nil がセットされています。

00:00:21.920 --> 00:00:25.480 align:middle
同じような表現式で
5 個の要素を持つ

00:00:26.040 --> 00:00:28.640 align:middle
配列を作ります。

00:00:29.160 --> 00:00:33.720 align:middle
Array クラスは色々なサイズの
インスタンスを作ることがわかります。

00:00:34.120 --> 00:00:38.480 align:middle
しかし、これまで、どうやっているのか
説明をしてきませんでした。

00:00:39.040 --> 00:00:40.040 align:middle
そこで

00:00:40.440 --> 00:00:45.720 align:middle
色々なサイズのインスタンスを持つ
クラスを定義する方法と

00:00:46.040 --> 00:00:49.080 align:middle
インスタンスを生成する方法と

00:00:49.240 --> 00:00:52.280 align:middle
可変なサイズにアクセスする方法を
お見せします。

00:00:52.800 --> 00:00:54.360 align:middle
では 1 つ目です。

00:00:55.600 --> 00:00:56.800 align:middle
とても簡単です。

00:00:57.600 --> 00:01:02.280 align:middle
定義する時に subclass: の代わりに
variableSubclass: を使います。

00:01:02.600 --> 00:01:05.040 align:middle
Array クラスの定義をコピーします。

00:01:05.280 --> 00:01:09.120 align:middle
大事なのは、クラスを生成するために

00:01:09.600 --> 00:01:12.240 align:middle
variableSubclass:instanceVariableNames: ...
を使うことです。

00:01:12.400 --> 00:01:15.760 align:middle
一方、通常は Point クラスや

21 align:middle
00:01:15,920 --> 00:01:18,800
Counter クラスや Dice クラスのように

00:01:19.280 --> 00:01:21.520 align:middle
subclass: を使います。

00:01:21.960 --> 00:01:26.800 align:middle
この定義を使うことで
インスタンスのサイズが可変になります。

00:01:27.200 --> 00:01:31.320 align:middle
この例では
StrangePoint を定義していますが

00:01:31.520 --> 00:01:34.640 align:middle
Point として
2 つのインスタンス変数 x と y

00:01:34.800 --> 00:01:38.600 align:middle
さらに可変長な領域を持ちます。

00:01:40.000 --> 00:01:44.640 align:middle
すると、こんな感じのオブジェクトができます。
インスタンスごとに、x の値と

00:01:45.480 --> 00:01:49.600 align:middle
y の値と
可変長領域があります。

00:01:49.760 --> 00:01:52.160 align:middle
別のインスタンスにも

00:01:52.320 --> 00:01:56.000 align:middle
x と y があって、
x はそれぞれ 10 と 20 で

00:01:56.160 --> 00:01:59.080 align:middle
y は例えば 100 と 200 で

00:01:59.760 --> 00:02:03.800 align:middle
それぞれオブジェクトを格納できる
可変長領域を持っています。

00:02:04.800 --> 00:02:09.600 align:middle
色々なサイズのインスタンスを
持つクラスのインスタンスは

00:02:09.800 --> 00:02:15.400 align:middle
x や y のような名前のある変数の後に
インデックス領域があります。

00:02:15.680 --> 00:02:18.680 align:middle
インデックス領域には名前はついておらず
1 つのクラスに 1 つしか持つことができません。

00:02:18.880 --> 00:02:22.360 align:middle
実装上の問題を避けるために
そうなっています。

00:02:22.520 --> 00:02:25.520 align:middle
これで、異なるサイズのインスタンスを持つ
クラスを定義する方法が

00:02:25.680 --> 00:02:28.240 align:middle
わかりましたね。

00:02:28.400 --> 00:02:32.120 align:middle
ではインスタンスを生成する方法と

00:02:32.320 --> 00:02:34.960 align:middle
可変長にアクセスする方法に
進みましょう。

00:02:36.120 --> 00:02:38.480 align:middle
インスタンスを生成するためには

00:02:38.720 --> 00:02:42.880 align:middle
new: メッセージを使います。
コロンが付いていることに注意してください。

00:02:43.080 --> 00:02:46.520 align:middle
コレクションの講義でやりましたね。

00:02:46.760 --> 00:02:49.920 align:middle
ここでは異なるサイズのオブジェクトを
生成したいわけですが

00:02:50.080 --> 00:02:54.480 align:middle
オブジェクトのサイズは
max で指定されます。

00:02:54.680 --> 00:02:58.280 align:middle
こうして 4 要素の配列という
オブジェクトを生成します。

00:02:58.880 --> 00:03:01.320 align:middle
こんな風に 4 つの要素を示します。

00:03:01.960 --> 00:03:04.400 align:middle
この可変サイズにアクセスするには

00:03:04.760 --> 00:03:09.400 align:middle
at: メッセージや at:put: メッセージを
使います。配列で見た通りです。

00:03:09.680 --> 00:03:13.880 align:middle
可変サイズのオブジェクトはどれでも
この方法で使うことができます。

00:03:14.280 --> 00:03:18.400 align:middle
つまり、ここで at: 2 とすると
'lulu' が入れられます。

00:03:20.480 --> 00:03:25.240 align:middle
1 つ目の値にアクセスすると
当然ですが nil が返ってきます。

00:03:25.440 --> 00:03:29.680 align:middle
2 つ目の値を見ると
'lulu' が得られます。

00:03:30.080 --> 00:03:33.320 align:middle
実際、at:put: や 'lulu' のような
配列の使い方は

00:03:33.520 --> 00:03:38.000 align:middle
可変サイズのオブジェクトにも
当てはまります。

00:03:38.160 --> 00:03:41.440 align:middle
この API プロトコルは配列にも

00:03:42.560 --> 00:03:47.320 align:middle
可変サイズのあらゆるオブジェクトにも
使うことができます。

00:03:49.680 --> 00:03:52.440 align:middle
ここではあまり多くは説明しませんが

00:03:52.600 --> 00:03:56.840 align:middle
Array クラスを定義する方法を
他のオブジェクトにも展開できます。

00:03:57.000 --> 00:03:58.960 align:middle
プロトコルを知っているからです。

00:03:59.840 --> 00:04:03.480 align:middle
Pharo では
色々な形態の

00:04:03.760 --> 00:04:05.880 align:middle
オブジェクトやクラスがあります。

00:04:06.080 --> 00:04:10.320 align:middle
名前がついたインスタンス変数しか
持たないクラスがあります。

00:04:10.600 --> 00:04:15.160 align:middle
count を持つ Counter クラスや
面の数を持つ Dice クラスのようなものです。

00:04:15.480 --> 00:04:18.880 align:middle
また、可変、あるいはインデックス領域
のみを持つクラスもあります。

00:04:19.200 --> 00:04:22.640 align:middle
配列などです。

00:04:22.800 --> 00:04:26.240 align:middle
そしてまた、その両方を持ち合わせた
クラスもあります。

00:04:26.960 --> 00:04:32.000 align:middle
しかし、制約条件もあります。
思った以上に微妙なものです。

00:04:32.160 --> 00:04:35.680 align:middle
これでクラスの可変性を
決めることができます。

00:04:35.840 --> 00:04:38.280 align:middle
ここではそれぞれの目的を示すに留めます。

00:04:38.440 --> 00:04:42.400 align:middle
これらの可変領域は

00:04:43.240 --> 00:04:47.840 align:middle
オブジェクトポインタや
バイトやワードを格納します。

00:04:48.440 --> 00:04:51.520 align:middle
それらは外部の世界との
インターフェイスに使われます。

00:04:51.680 --> 00:04:54.160 align:middle
サイズを指定して

00:04:54.360 --> 00:04:58.840 align:middle
オブジェクトへのポインタを
特殊な形式で格納します。

00:04:59.240 --> 00:05:03.480 align:middle
これは上級向けの機能ですが
お見せしておきたかったのです。

00:05:03.680 --> 00:05:06.760 align:middle
普段は subclass: しか
使う必要はないでしょう。

00:05:06.920 --> 00:05:10.280 align:middle
時々、variableSubclass: を
使うことになるでしょう。

00:05:10.680 --> 00:05:14.080 align:middle
Bitmap はスクリーンを表す

00:05:14.280 --> 00:05:17.280 align:middle
オブジェクトですが

00:05:17.840 --> 00:05:20.440 align:middle
ワードを格納する可変長領域があります。

00:05:21.280 --> 00:05:23.280 align:middle
そういうものがある
ということを知っておいてください。

00:05:23.680 --> 00:05:27.600 align:middle
Pharo はリフレクティブなシステムなので

00:05:27.760 --> 00:05:29.800 align:middle
質問は Pharo に訊けばよいのです。

00:05:29.960 --> 00:05:33.680 align:middle
これらのメソッドを使って
Pharo に訊くことができます。

00:05:33.840 --> 00:05:37.840 align:middle
クラスのサイズが固定か可変かや

00:05:38.000 --> 00:05:41.560 align:middle
ポインタを格納するのか、バイトなのか
などです。

00:05:41.760 --> 00:05:46.160 align:middle
クラスの種類について質問するための
API があります。

00:05:46.400 --> 00:05:50.120 align:middle
この表も、システムに質問して
作成しました。

00:05:51.240 --> 00:05:52.640 align:middle
制約があります。

00:05:53.640 --> 00:05:58.480 align:middle
subclass: で定義されたクラスの

00:05:58.880 --> 00:06:01.080 align:middle
サブクラスはどの種類でもかまいません。

00:06:01.280 --> 00:06:04.040 align:middle
x や y を持つ Point があるとして

00:06:04.280 --> 00:06:07.600 align:middle
加えて z を持つサブクラスを定義することも

00:06:07.840 --> 00:06:12.440 align:middle
可変領域を追加したサブクラスを
定義することもできます。

00:06:14.520 --> 00:06:20.520 align:middle
しかし、可変領域を持つクラスの
サブクラスを作る場合には

00:06:20.720 --> 00:06:25.560 align:middle
その可変領域のクラスの
可変領域しか使うことはできません。

00:06:25.760 --> 00:06:30.680 align:middle
破ろうとすると
システムが互換性がないと言います。

00:06:30.840 --> 00:06:35.800 align:middle
可変領域は 1 つしか持てないのです。

00:06:36.000 --> 00:06:40.280 align:middle
いずれにせよ、システムは
それは不可能だと言います。

00:06:41.000 --> 00:06:43.200 align:middle
理解しておくべきことは

00:06:43.440 --> 00:06:46.920 align:middle
可変長のインスタンスを持つクラスを

00:06:47.080 --> 00:06:50.520 align:middle
定義する方法と

00:06:50.680 --> 00:06:56.520 align:middle
new: でインスタンスを生成する方法と

00:06:56.840 --> 00:07:02.320 align:middle
可変領域へアクセスする方法で
これは配列でのアクセスと同様です。

