WEBVTT

00:00:00.000 --> 00:00:02.160 align:middle
このレッスンではブロックを紹介します。

00:00:02.320 --> 00:00:06.640 align:middle
ブロックはある種の匿名メソッドで
レキシカルクロージャとも呼ばれます。

00:00:06.800 --> 00:00:08.720 align:middle
ブロックは Pharo のあらゆる所で使われています。

00:00:08.880 --> 00:00:12.160 align:middle
ブロックはループや条件分岐やイテレーターの
基礎となっています。

00:00:12.320 --> 00:00:14.680 align:middle
GUIや専用言語の基礎でもあります。

00:00:14.840 --> 00:00:17.120 align:middle
ブロックはシステムの心臓部なのです。

00:00:17.280 --> 00:00:21.280 align:middle
Java では最近のバージョンでしか
導入されていません。

00:00:23.000 --> 00:00:27.400 align:middle
ブロックを定義するためには
角括弧を使います。

00:00:27.560 --> 00:00:28.920 align:middle
ここに例があります。

00:00:29.080 --> 00:00:32.760 align:middle
[expressions...]

00:00:34.840 --> 00:00:37.840 align:middle
ブロックの定義についてお話します。

00:00:38.000 --> 00:00:40.000 align:middle
別の例です。

00:00:40.160 --> 00:00:42.840 align:middle
この表現式 1/0 は

00:00:43.000 --> 00:00:46.760 align:middle
実行されるとエラーになります。

00:00:47.760 --> 00:00:50.600 align:middle
この式をブロックに隠蔽して

00:00:50.760 --> 00:00:54.920 align:middle
表現式 1/0 を持つブロックを定義しましょう。

00:00:55.080 --> 00:01:00.040 align:middle
このブロック定義を評価しても何も起こりません。
エラーも発生しません。

00:01:00.200 --> 00:01:02.400 align:middle
ブロックを返します。

00:01:02.560 --> 00:01:06.160 align:middle
ブロックの定義はその本体を実行しません。

00:01:07.720 --> 00:01:11.480 align:middle
沢山のブロックを好きなだけ定義することができます。

00:01:11.640 --> 00:01:14.240 align:middle
本体の表現式は凍結されています。

00:01:15.240 --> 00:01:18.560 align:middle
ブロックとその本体の表現式を評価するためには

00:01:18.720 --> 00:01:21.760 align:middle
value メッセージで明示的に行う必要があります。

00:01:21.920 --> 00:01:24.520 align:middle
例えば、このブロック
[2 + 6]

00:01:24.680 --> 00:01:26.640 align:middle
これに value メッセージを送ります。

00:01:26.800 --> 00:01:29.760 align:middle
本体の表現式が評価されます。

00:01:29.920 --> 00:01:33.360 align:middle
結果が返ってきます。
8です。

00:01:34.320 --> 00:01:37.760 align:middle
しかし
ブロックがエラーを起こす表現式を持っている場合

00:01:37.920 --> 00:01:40.960 align:middle
ブロックが評価された時に
エラーが返ってきます。

00:01:41.120 --> 00:01:42.720 align:middle
例2にある通りです。

00:01:42.880 --> 00:01:46.560 align:middle
[1/0]
このブロックに value メッセージを送ると

00:01:46.720 --> 00:01:48.400 align:middle
エラーが返ってきます。

00:01:49.760 --> 00:01:52.960 align:middle
ブロックは引数を取ることもできます。

00:01:53.120 --> 00:01:56.240 align:middle
メソッドのように。

00:01:56.400 --> 00:02:01.400 align:middle
ブロックは常に [ で始まり

00:02:01.560 --> 00:02:03.120 align:middle
] で閉じられます。

00:02:03.280 --> 00:02:08.360 align:middle
引数は接頭辞としてコロンがつけられます。

00:02:08.520 --> 00:02:11.760 align:middle
次に | つまりパイプ(縦棒)がきます。

00:02:11.920 --> 00:02:16.240 align:middle
パイプは引数宣言をブロックの本体から分離します。

00:02:16.400 --> 00:02:18.200 align:middle
そして表現式が続きます。

00:02:18.360 --> 00:02:21.560 align:middle
この例では引数は x です。

00:02:21.720 --> 00:02:24.360 align:middle
x + 2 がこのブロックの唯一の表現式です。

00:02:24.520 --> 00:02:27.120 align:middle
このブロックを評価するためには

00:02:27.280 --> 00:02:31.040 align:middle
value: メッセージに引数をつけて送ります。

00:02:31.200 --> 00:02:35.600 align:middle
引数 x に 5 を渡して

00:02:35.760 --> 00:02:38.560 align:middle
ブロックの表現式が評価されます。

00:02:38.720 --> 00:02:42.880 align:middle
このブロックに value: 5 メッセージを送ると

00:02:43.040 --> 00:02:44.400 align:middle
7 が返ってきます。

00:02:44.560 --> 00:02:48.160 align:middle
x を 5 として
ブロックが評価されるからです。

00:02:48.800 --> 00:02:50.680 align:middle
この例は前の例と似ていますが

00:02:50.840 --> 00:02:55.200 align:middle
1つのブロックに複数の表現式が入っています。

00:02:55.360 --> 00:02:58.720 align:middle
ここでは2つ。
x+33 と x+2 です。

00:02:58.880 --> 00:03:01.400 align:middle
value: 5 を送ると

00:03:01.560 --> 00:03:04.680 align:middle
ブロックの表現式が評価されて

00:03:04.840 --> 00:03:07.600 align:middle
返り値が返ってきますが

00:03:07.760 --> 00:03:12.120 align:middle
ブロックの最後の表現式の値のみ

00:03:12.280 --> 00:03:16.200 align:middle
つまり x + 2 の結果のみが返ってきます。

00:03:16.960 --> 00:03:17.960 align:middle
7 です。

00:03:19.640 --> 00:03:22.480 align:middle
Pharo ではブロックは通常のオブジェクトです。

00:03:22.640 --> 00:03:25.120 align:middle
ブロックを一時変数に格納することができます。

00:03:25.280 --> 00:03:28.160 align:middle
ブロックにメッセージを送ることができます。
通常のオブジェクトのように。

00:03:28.320 --> 00:03:31.120 align:middle
ここに例があります。

00:03:31.280 --> 00:03:35.160 align:middle
このブロックの定義 x + 2 を

00:03:35.320 --> 00:03:37.080 align:middle
変数 add2 に格納することができます。

00:03:37.240 --> 00:03:40.680 align:middle
そして何回かこのブロックを評価するために
メッセージを投げます。

00:03:40.840 --> 00:03:43.000 align:middle
まずはvalue:メッセージを投げます。

00:03:43.160 --> 00:03:46.640 align:middle
5を引数として評価して
7が返ってきます。

00:03:46.800 --> 00:03:49.720 align:middle
そして value: 33 メッセージです。

00:03:49.880 --> 00:03:51.920 align:middle
35が返ってきます。

00:03:52.080 --> 00:03:55.800 align:middle
複数の引数を持つブロックを定義することもできます。

00:03:55.960 --> 00:04:00.720 align:middle
例えば x と y です。
このブロックは2つの引数を持ちます。

00:04:00.880 --> 00:04:05.160 align:middle
しかしこのブロックをどうやって評価するのでしょうか？

00:04:05.320 --> 00:04:09.840 align:middle
評価を開始するには2つの値を渡す必要があります。

00:04:10.000 --> 00:04:13.200 align:middle
x と y としてそれぞれ 5 と 7 を渡すには？

00:04:13.840 --> 00:04:19.040 align:middle
答えは
value:value: メッセージです。

00:04:19.760 --> 00:04:22.760 align:middle
ブロックのクラスのメソッドです。

00:04:22.920 --> 00:04:28.080 align:middle
x が 5、y が 7として

00:04:28.240 --> 00:04:29.880 align:middle
12が返ってきます。

00:04:32.880 --> 00:04:36.960 align:middle
メソッドと同様に
ブロックにも一時変数を定義できます。

00:04:37.120 --> 00:04:40.680 align:middle
この例は

00:04:40.840 --> 00:04:43.360 align:middle
Collectionクラスからの実例です。

00:04:43.520 --> 00:04:47.880 align:middle
ブロックはここから始まって
ここで終わります。

00:04:48.880 --> 00:04:52.800 align:middle
一つの引数 index を取ります。

00:04:53.800 --> 00:04:57.520 align:middle
2つの | に挟まれて1つの一時変数があります。

00:04:57.680 --> 00:04:58.960 align:middle
args です。

00:04:59.760 --> 00:05:02.200 align:middle
この一時変数 args は

00:05:02.360 --> 00:05:07.160 align:middle
ブロックの表現式を評価している間だけ存在します。

00:05:09.080 --> 00:05:11.920 align:middle
ブロックはメソッドの中で定義されます。

00:05:12.080 --> 00:05:16.240 align:middle
ブロックの中でもリターンを使うことができます。

00:05:16.400 --> 00:05:20.600 align:middle
これは Integer クラスからの例です。

00:05:20.760 --> 00:05:23.280 align:middle
これは factorial メソッドです。

00:05:24.040 --> 00:05:27.960 align:middle
このメソッドにはいくつかのブロックがあります。

00:05:28.120 --> 00:05:31.760 align:middle
これらのブロックにはリターン(^)があります。

00:05:31.920 --> 00:05:35.720 align:middle
リターンは factorial メソッドから脱出します。

00:05:35.880 --> 00:05:39.600 align:middle
例えば 0 に factorial メッセージを送ると

00:05:39.760 --> 00:05:41.640 align:middle
1 が返ってきます。

00:05:41.800 --> 00:05:46.880 align:middle
この答えが得られるのは、ブロックの最初の ^ があるからです。

00:05:47.040 --> 00:05:49.640 align:middle
ここで factorial メソッドから脱出しています。

00:05:49.800 --> 00:05:52.920 align:middle
ブロックの中にあるリターンは
そのブロックを定義しているメソッドから

00:05:53.080 --> 00:05:54.960 align:middle
脱出します。

00:05:56.680 --> 00:05:59.360 align:middle
ブロックを使う上でのアドバイスが1つあります。

00:05:59.520 --> 00:06:02.400 align:middle
ブロックはとても強力な要素です。

00:06:02.560 --> 00:06:04.480 align:middle
注意深く使ってください。

00:06:04.640 --> 00:06:08.440 align:middle
1つに2つか3つ以上の引数を持たせないこと。

00:06:08.600 --> 00:06:11.320 align:middle
もしそれを超える引数を持たせたら
読解不能になります。

00:06:11.480 --> 00:06:15.280 align:middle
インスタンス変数とメソッドがあるクラスを
定義したほうが良いです。

00:06:15.440 --> 00:06:17.200 align:middle
そのほうがずっと読み易いです。

00:06:17.960 --> 00:06:22.160 align:middle
このコースではブロックを学びました。
ブロックの構文

00:06:22.320 --> 00:06:25.600 align:middle
ある種の匿名メソッドであること

00:06:25.760 --> 00:06:27.800 align:middle
つまりレキシカルクロージャだということ

00:06:27.960 --> 00:06:31.960 align:middle
他のオブジェクト同様に
変数に格納できること。

00:06:32.120 --> 00:06:37.400 align:middle
別のレッスンでは
ブロックが沢山の言語機能の基礎になっている

00:06:37.560 --> 00:06:40.440 align:middle
ことを学びます。
ループやイテレーション等です。

