1 00:00:00,440 --> 00:00:05,120 このビデオでは、Pharo の講義では あまりカバーされないことを説明します。 2 00:00:05,320 --> 00:00:08,040 可変長のオブジェクトを 定義する方法です。 3 00:00:09,360 --> 00:00:13,760 お気付きでしょうが、我々はもう既に サイズが異なるオブジェクトを使っています。 4 00:00:13,920 --> 00:00:18,040 この表現式で配列を作ります。 5 00:00:18,240 --> 00:00:21,680 10 個の要素を持っていて いずれも nil がセットされています。 6 00:00:21,920 --> 00:00:25,480 同じような表現式で 5 個の要素を持つ 7 00:00:26,040 --> 00:00:28,640 配列を作ります。 8 00:00:29,160 --> 00:00:33,720 Array クラスは色々なサイズの インスタンスを作ることがわかります。 9 00:00:34,120 --> 00:00:38,480 しかし、これまで、どうやっているのか 説明をしてきませんでした。 10 00:00:39,040 --> 00:00:40,040 そこで 11 00:00:40,440 --> 00:00:45,720 色々なサイズのインスタンスを持つ クラスを定義する方法と 12 00:00:46,040 --> 00:00:49,080 インスタンスを生成する方法と 13 00:00:49,240 --> 00:00:52,280 可変なサイズにアクセスする方法を お見せします。 14 00:00:52,800 --> 00:00:54,360 では 1 つ目です。 15 00:00:55,600 --> 00:00:56,800 とても簡単です。 16 00:00:57,600 --> 00:01:02,280 定義する時に subclass: の代わりに variableSubclass: を使います。 17 00:01:02,600 --> 00:01:05,040 Array クラスの定義をコピーします。 18 00:01:05,280 --> 00:01:09,120 大事なのは、クラスを生成するために 19 00:01:09,600 --> 00:01:12,240 variableSubclass:instanceVariableNames: ... を使うことです。 20 00:01:12,400 --> 00:01:15,760 一方、通常は Point クラスや 21 00:01:15,920 --> 00:01:18,800 Counter クラスや Dice クラスのように 22 00:01:19,280 --> 00:01:21,520 subclass: を使います。 23 00:01:21,960 --> 00:01:26,800 この定義を使うことで インスタンスのサイズが可変になります。 24 00:01:27,200 --> 00:01:31,320 この例では StrangePoint を定義していますが 25 00:01:31,520 --> 00:01:34,640 Point として 2 つのインスタンス変数 x と y 26 00:01:34,800 --> 00:01:38,600 さらに可変長な領域を持ちます。 27 00:01:40,000 --> 00:01:44,640 すると、こんな感じのオブジェクトができます。 インスタンスごとに、x の値と 28 00:01:45,480 --> 00:01:49,600 y の値と 可変長領域があります。 29 00:01:49,760 --> 00:01:52,160 別のインスタンスにも 30 00:01:52,320 --> 00:01:56,000 x と y があって、 x はそれぞれ 10 と 20 で 31 00:01:56,160 --> 00:01:59,080 y は例えば 100 と 200 で 32 00:01:59,760 --> 00:02:03,800 それぞれオブジェクトを格納できる 可変長領域を持っています。 33 00:02:04,800 --> 00:02:09,600 色々なサイズのインスタンスを 持つクラスのインスタンスは 34 00:02:09,800 --> 00:02:15,400 x や y のような名前のある変数の後に インデックス領域があります。 35 00:02:15,680 --> 00:02:18,680 インデックス領域には名前はついておらず 1 つのクラスに 1 つしか持つことができません。 36 00:02:18,880 --> 00:02:22,360 実装上の問題を避けるために そうなっています。 37 00:02:22,520 --> 00:02:25,520 これで、異なるサイズのインスタンスを持つ クラスを定義する方法が 38 00:02:25,680 --> 00:02:28,240 わかりましたね。 39 00:02:28,400 --> 00:02:32,120 ではインスタンスを生成する方法と 40 00:02:32,320 --> 00:02:34,960 可変長にアクセスする方法に 進みましょう。 41 00:02:36,120 --> 00:02:38,480 インスタンスを生成するためには 42 00:02:38,720 --> 00:02:42,880 new: メッセージを使います。 コロンが付いていることに注意してください。 43 00:02:43,080 --> 00:02:46,520 コレクションの講義でやりましたね。 44 00:02:46,760 --> 00:02:49,920 ここでは異なるサイズのオブジェクトを 生成したいわけですが 45 00:02:50,080 --> 00:02:54,480 オブジェクトのサイズは max で指定されます。 46 00:02:54,680 --> 00:02:58,280 こうして 4 要素の配列という オブジェクトを生成します。 47 00:02:58,880 --> 00:03:01,320 こんな風に 4 つの要素を示します。 48 00:03:01,960 --> 00:03:04,400 この可変サイズにアクセスするには 49 00:03:04,760 --> 00:03:09,400 at: メッセージや at:put: メッセージを 使います。配列で見た通りです。 50 00:03:09,680 --> 00:03:13,880 可変サイズのオブジェクトはどれでも この方法で使うことができます。 51 00:03:14,280 --> 00:03:18,400 つまり、ここで at: 2 とすると 'lulu' が入れられます。 52 00:03:20,480 --> 00:03:25,240 1 つ目の値にアクセスすると 当然ですが nil が返ってきます。 53 00:03:25,440 --> 00:03:29,680 2 つ目の値を見ると 'lulu' が得られます。 54 00:03:30,080 --> 00:03:33,320 実際、at:put: や 'lulu' のような 配列の使い方は 55 00:03:33,520 --> 00:03:38,000 可変サイズのオブジェクトにも 当てはまります。 56 00:03:38,160 --> 00:03:41,440 この API プロトコルは配列にも 57 00:03:42,560 --> 00:03:47,320 可変サイズのあらゆるオブジェクトにも 使うことができます。 58 00:03:49,680 --> 00:03:52,440 ここではあまり多くは説明しませんが 59 00:03:52,600 --> 00:03:56,840 Array クラスを定義する方法を 他のオブジェクトにも展開できます。 60 00:03:57,000 --> 00:03:58,960 プロトコルを知っているからです。 61 00:03:59,840 --> 00:04:03,480 Pharo では 色々な形態の 62 00:04:03,760 --> 00:04:05,880 オブジェクトやクラスがあります。 63 00:04:06,080 --> 00:04:10,320 名前がついたインスタンス変数しか 持たないクラスがあります。 64 00:04:10,600 --> 00:04:15,160 count を持つ Counter クラスや 面の数を持つ Dice クラスのようなものです。 65 00:04:15,480 --> 00:04:18,880 また、可変、あるいはインデックス領域 のみを持つクラスもあります。 66 00:04:19,200 --> 00:04:22,640 配列などです。 67 00:04:22,800 --> 00:04:26,240 そしてまた、その両方を持ち合わせた クラスもあります。 68 00:04:26,960 --> 00:04:32,000 しかし、制約条件もあります。 思った以上に微妙なものです。 69 00:04:32,160 --> 00:04:35,680 これでクラスの可変性を 決めることができます。 70 00:04:35,840 --> 00:04:38,280 ここではそれぞれの目的を示すに留めます。 71 00:04:38,440 --> 00:04:42,400 これらの可変領域は 72 00:04:43,240 --> 00:04:47,840 オブジェクトポインタや バイトやワードを格納します。 73 00:04:48,440 --> 00:04:51,520 それらは外部の世界との インターフェイスに使われます。 74 00:04:51,680 --> 00:04:54,160 サイズを指定して 75 00:04:54,360 --> 00:04:58,840 オブジェクトへのポインタを 特殊な形式で格納します。 76 00:04:59,240 --> 00:05:03,480 これは上級向けの機能ですが お見せしておきたかったのです。 77 00:05:03,680 --> 00:05:06,760 普段は subclass: しか 使う必要はないでしょう。 78 00:05:06,920 --> 00:05:10,280 時々、variableSubclass: を 使うことになるでしょう。 79 00:05:10,680 --> 00:05:14,080 Bitmap はスクリーンを表す 80 00:05:14,280 --> 00:05:17,280 オブジェクトですが 81 00:05:17,840 --> 00:05:20,440 ワードを格納する可変長領域があります。 82 00:05:21,280 --> 00:05:23,280 そういうものがある ということを知っておいてください。 83 00:05:23,680 --> 00:05:27,600 Pharo はリフレクティブなシステムなので 84 00:05:27,760 --> 00:05:29,800 質問は Pharo に訊けばよいのです。 85 00:05:29,960 --> 00:05:33,680 これらのメソッドを使って Pharo に訊くことができます。 86 00:05:33,840 --> 00:05:37,840 クラスのサイズが固定か可変かや 87 00:05:38,000 --> 00:05:41,560 ポインタを格納するのか、バイトなのか などです。 88 00:05:41,760 --> 00:05:46,160 クラスの種類について質問するための API があります。 89 00:05:46,400 --> 00:05:50,120 この表も、システムに質問して 作成しました。 90 00:05:51,240 --> 00:05:52,640 制約があります。 91 00:05:53,640 --> 00:05:58,480 subclass: で定義されたクラスの 92 00:05:58,880 --> 00:06:01,080 サブクラスはどの種類でもかまいません。 93 00:06:01,280 --> 00:06:04,040 x や y を持つ Point があるとして 94 00:06:04,280 --> 00:06:07,600 加えて z を持つサブクラスを定義することも 95 00:06:07,840 --> 00:06:12,440 可変領域を追加したサブクラスを 定義することもできます。 96 00:06:14,520 --> 00:06:20,520 しかし、可変領域を持つクラスの サブクラスを作る場合には 97 00:06:20,720 --> 00:06:25,560 その可変領域のクラスの 可変領域しか使うことはできません。 98 00:06:25,760 --> 00:06:30,680 破ろうとすると システムが互換性がないと言います。 99 00:06:30,840 --> 00:06:35,800 可変領域は 1 つしか持てないのです。 100 00:06:36,000 --> 00:06:40,280 いずれにせよ、システムは それは不可能だと言います。 101 00:06:41,000 --> 00:06:43,200 理解しておくべきことは 102 00:06:43,440 --> 00:06:46,920 可変長のインスタンスを持つクラスを 103 00:06:47,080 --> 00:06:50,520 定義する方法と 104 00:06:50,680 --> 00:06:56,520 new: でインスタンスを生成する方法と 105 00:06:56,840 --> 00:07:02,320 可変領域へアクセスする方法で これは配列でのアクセスと同様です。