1 00:00:00,760 --> 00:00:04,120 こんにちは。このセッションでは クラスメソッドについてお話します。 2 00:00:05,320 --> 00:00:07,960 Pharo では、全てのものはオブジェクトで 3 00:00:08,120 --> 00:00:10,400 オブジェクトにメッセージを送ることができます。 4 00:00:11,120 --> 00:00:14,320 つまり、これら2つの情報を基にすれば 5 00:00:14,480 --> 00:00:16,160 クラスもオブジェクトであり 6 00:00:16,320 --> 00:00:19,880 したがってクラスに情報 つまりメッセージを送ることができます。 7 00:00:21,120 --> 00:00:22,800 例題を2つ示します。 8 00:00:22,960 --> 00:00:27,480 Time now では、Time クラスという オブジェクトに now メッセージを送ります。 9 00:00:27,640 --> 00:00:29,800 そして今の時刻が返ってきます。 10 00:00:31,160 --> 00:00:32,680 つまり、now メッセージを 11 00:00:33,680 --> 00:00:37,320 クラスである Time オブジェクトに送ります。 12 00:00:38,360 --> 00:00:40,320 すると今の時刻が送り返されます。 13 00:00:40,480 --> 00:00:45,440 同じように、クラスである Date オブジェクトに todayメッセージを送ると 14 00:00:45,600 --> 00:00:47,400 日付が返ってきます。 15 00:00:47,560 --> 00:00:49,480 もう3つ例があります。 16 00:00:50,200 --> 00:00:54,440 FileLocator クラスに workingDirectory メッセージを送ると 17 00:00:54,600 --> 00:00:58,040 現在のパスが返ってきます。 18 00:00:58,200 --> 00:01:02,520 つまり実行されているファイルのディレクトリパスです。 19 00:01:03,720 --> 00:01:05,080 2つ目の例は 20 00:01:05,240 --> 00:01:08,760 ZnEasy オブジェクトに getPng: メッセージを送ります。 21 00:01:08,920 --> 00:01:13,000 引数として png ファイルの URL を付けて。 22 00:01:13,160 --> 00:01:17,160 すると、ダウンロードされた png ファイルを 返します。 23 00:01:18,600 --> 00:01:19,920 3つ目の例は 24 00:01:20,080 --> 00:01:24,000 これまたクラスである ZnServer に startDefaultOn: メッセージを 25 00:01:24,160 --> 00:01:25,800 ポート番号を引数にして送ります。 26 00:01:27,160 --> 00:01:30,280 これは HTTP サーバを立ち上げます。 27 00:01:31,480 --> 00:01:35,360 これら3つのケースでは 1つのクラスに1つのメッセージを送ります。 28 00:01:36,320 --> 00:01:40,200 どうやってクラスメソッドを実装するのでしょう? 29 00:01:41,000 --> 00:01:42,560 クラスを選択して 30 00:01:43,960 --> 00:01:47,880 class ボタンを押すことで インスタンス側ではなくクラス側に 31 00:01:48,040 --> 00:01:50,960 メソッドを実装したいということを示します。 32 00:01:51,120 --> 00:01:53,920 あとはいつも通りにメソッドを実装します。 33 00:01:54,800 --> 00:01:58,880 つまり today メソッドは Date クラスの 34 00:01:59,040 --> 00:02:00,880 クラス側に実装されています。 35 00:02:03,440 --> 00:02:07,080 クラス側のメソッドで ありがちな間違いというものがあります。 36 00:02:07,240 --> 00:02:12,760 ここでは withValue: メッセージを 37 00:02:12,920 --> 00:02:14,920 Counter クラスに送ることで 38 00:02:15,080 --> 00:02:19,040 引数の値がセットされた 新しいカウンターを得たいのです。 39 00:02:19,200 --> 00:02:20,800 つまり 40 00:02:22,520 --> 00:02:26,840 Counter withValue: 10 は 値が10で始まるカウンターを返します。 41 00:02:28,280 --> 00:02:32,560 もしこの表現式を評価したら Counter という値が得られます。 42 00:02:32,720 --> 00:02:34,240 新しいカウンターではなく。 43 00:02:34,400 --> 00:02:38,240 つまり、このクラスのインスタンスではなく そのクラス自身が得られます。 44 00:02:38,400 --> 00:02:41,320 なぜこんな間違いが起こるのでしょう? 何が問題なのでしょう? 45 00:02:41,480 --> 00:02:46,320 問題は、メソッドはデフォルトでは self を返すということです。 46 00:02:47,280 --> 00:02:51,560 つまり、もし返り値を明示しなければ メソッドは self を返します。 47 00:02:51,720 --> 00:02:56,160 したがって、この上のほうのコードは 下のほうのコードと等価です。 48 00:02:56,320 --> 00:02:59,320 この場合、self は Counter クラスです。 49 00:03:00,640 --> 00:03:05,640 したがってメソッドはそのクラス自身を返します。 今まさに作ったばかりのインスタンスではなく。 50 00:03:05,800 --> 00:03:07,640 この問題を直すには 51 00:03:07,800 --> 00:03:11,680 単にキャレット( ^ )を 52 00:03:11,840 --> 00:03:13,320 self new の前に付けるだけです。 53 00:03:14,240 --> 00:03:16,880 まとめると クラスはオブジェクトです。 54 00:03:17,040 --> 00:03:21,560 あらゆるオブジェクトにメッセージを送ることができるので あらゆるクラスにもメッセージを投げることができます。 55 00:03:21,720 --> 00:03:24,360 それらのメッセージに対応するメソッドを実装するには 56 00:03:24,520 --> 00:03:29,000 クラスを選択して class ボタンを押す必要があります。 57 00:03:30,000 --> 00:03:33,160 大部分のクラスメソッドは 新しいインスタンスを作りますが 58 00:03:33,320 --> 00:03:36,000 それだけでなく、他のこともします。 59 00:03:36,160 --> 00:03:40,480 クラスメソッドの他の利用法が Pharo の中にたくさん見つかります。 60 00:03:40,640 --> 00:03:44,800 クラスメソッドは他のメソッドと同じで 61 00:03:44,960 --> 00:03:46,800 特別なルールはありません。 62 00:03:46,960 --> 00:03:49,960 メソッド探索は全く同じ方法で行われます。 63 00:03:50,120 --> 00:03:52,160 次週にそれを学びます。