WEBVTT

00:00:00.760 --> 00:00:04.120 align:middle
こんにちは。このセッションでは
クラスメソッドについてお話します。

00:00:05.320 --> 00:00:07.960 align:middle
Pharo では、全てのものはオブジェクトで

00:00:08.120 --> 00:00:10.400 align:middle
オブジェクトにメッセージを送ることができます。

00:00:11.120 --> 00:00:14.320 align:middle
つまり、これら2つの情報を基にすれば

00:00:14.480 --> 00:00:16.160 align:middle
クラスもオブジェクトであり

00:00:16.320 --> 00:00:19.880 align:middle
したがってクラスに情報
つまりメッセージを送ることができます。

00:00:21.120 --> 00:00:22.800 align:middle
例題を2つ示します。

00:00:22.960 --> 00:00:27.480 align:middle
Time now では、Time クラスという
オブジェクトに now メッセージを送ります。

00:00:27.640 --> 00:00:29.800 align:middle
そして今の時刻が返ってきます。

00:00:31.160 --> 00:00:32.680 align:middle
つまり、now メッセージを

00:00:33.680 --> 00:00:37.320 align:middle
クラスである Time オブジェクトに送ります。

00:00:38.360 --> 00:00:40.320 align:middle
すると今の時刻が送り返されます。

00:00:40.480 --> 00:00:45.440 align:middle
同じように、クラスである Date オブジェクトに
todayメッセージを送ると

00:00:45.600 --> 00:00:47.400 align:middle
日付が返ってきます。

00:00:47.560 --> 00:00:49.480 align:middle
もう3つ例があります。

00:00:50.200 --> 00:00:54.440 align:middle
FileLocator クラスに
workingDirectory メッセージを送ると

00:00:54.600 --> 00:00:58.040 align:middle
現在のパスが返ってきます。

00:00:58.200 --> 00:01:02.520 align:middle
つまり実行されているファイルのディレクトリパスです。

00:01:03.720 --> 00:01:05.080 align:middle
2つ目の例は

00:01:05.240 --> 00:01:08.760 align:middle
ZnEasy オブジェクトに
getPng: メッセージを送ります。

21 align:middle
00:01:08,920 --> 00:01:13,000
引数として png ファイルの URL を付けて。

00:01:13.160 --> 00:01:17.160 align:middle
すると、ダウンロードされた png ファイルを
返します。

00:01:18.600 --> 00:01:19.920 align:middle
3つ目の例は

00:01:20.080 --> 00:01:24.000 align:middle
これまたクラスである ZnServer に
startDefaultOn: メッセージを

00:01:24.160 --> 00:01:25.800 align:middle
ポート番号を引数にして送ります。

00:01:27.160 --> 00:01:30.280 align:middle
これは HTTP サーバを立ち上げます。

00:01:31.480 --> 00:01:35.360 align:middle
これら3つのケースでは
1つのクラスに1つのメッセージを送ります。

00:01:36.320 --> 00:01:40.200 align:middle
どうやってクラスメソッドを実装するのでしょう？

00:01:41.000 --> 00:01:42.560 align:middle
クラスを選択して

00:01:43.960 --> 00:01:47.880 align:middle
class ボタンを押すことで
インスタンス側ではなくクラス側に

00:01:48.040 --> 00:01:50.960 align:middle
メソッドを実装したいということを示します。

00:01:51.120 --> 00:01:53.920 align:middle
あとはいつも通りにメソッドを実装します。

00:01:54.800 --> 00:01:58.880 align:middle
つまり today メソッドは
Date クラスの

00:01:59.040 --> 00:02:00.880 align:middle
クラス側に実装されています。

00:02:03.440 --> 00:02:07.080 align:middle
クラス側のメソッドで
ありがちな間違いというものがあります。

00:02:07.240 --> 00:02:12.760 align:middle
ここでは withValue: メッセージを

00:02:12.920 --> 00:02:14.920 align:middle
Counter クラスに送ることで

00:02:15.080 --> 00:02:19.040 align:middle
引数の値がセットされた
新しいカウンターを得たいのです。

00:02:19.200 --> 00:02:20.800 align:middle
つまり

00:02:22.520 --> 00:02:26.840 align:middle
Counter withValue: 10 は
値が10で始まるカウンターを返します。

00:02:28.280 --> 00:02:32.560 align:middle
もしこの表現式を評価したら
Counter という値が得られます。

00:02:32.720 --> 00:02:34.240 align:middle
新しいカウンターではなく。

00:02:34.400 --> 00:02:38.240 align:middle
つまり、このクラスのインスタンスではなく
そのクラス自身が得られます。

00:02:38.400 --> 00:02:41.320 align:middle
なぜこんな間違いが起こるのでしょう？
何が問題なのでしょう？

00:02:41.480 --> 00:02:46.320 align:middle
問題は、メソッドはデフォルトでは
self を返すということです。

00:02:47.280 --> 00:02:51.560 align:middle
つまり、もし返り値を明示しなければ
メソッドは self を返します。

00:02:51.720 --> 00:02:56.160 align:middle
したがって、この上のほうのコードは
下のほうのコードと等価です。

00:02:56.320 --> 00:02:59.320 align:middle
この場合、self は Counter クラスです。

00:03:00.640 --> 00:03:05.640 align:middle
したがってメソッドはそのクラス自身を返します。
今まさに作ったばかりのインスタンスではなく。

00:03:05.800 --> 00:03:07.640 align:middle
この問題を直すには

00:03:07.800 --> 00:03:11.680 align:middle
単にキャレット（ ^ ）を

00:03:11.840 --> 00:03:13.320 align:middle
self new の前に付けるだけです。

00:03:14.240 --> 00:03:16.880 align:middle
まとめると
クラスはオブジェクトです。

00:03:17.040 --> 00:03:21.560 align:middle
あらゆるオブジェクトにメッセージを送ることができるので
あらゆるクラスにもメッセージを投げることができます。

00:03:21.720 --> 00:03:24.360 align:middle
それらのメッセージに対応するメソッドを実装するには

00:03:24.520 --> 00:03:29.000 align:middle
クラスを選択して
class ボタンを押す必要があります。

00:03:30.000 --> 00:03:33.160 align:middle
大部分のクラスメソッドは
新しいインスタンスを作りますが

00:03:33.320 --> 00:03:36.000 align:middle
それだけでなく、他のこともします。

00:03:36.160 --> 00:03:40.480 align:middle
クラスメソッドの他の利用法が
Pharo の中にたくさん見つかります。

00:03:40.640 --> 00:03:44.800 align:middle
クラスメソッドは他のメソッドと同じで

00:03:44.960 --> 00:03:46.800 align:middle
特別なルールはありません。

00:03:46.960 --> 00:03:49.960 align:middle
メソッド探索は全く同じ方法で行われます。

00:03:50.120 --> 00:03:52.160 align:middle
次週にそれを学びます。

