1 00:00:00,000 --> 00:00:02,160 このレッスンではブロックを紹介します。 2 00:00:02,320 --> 00:00:06,640 ブロックはある種の匿名メソッドで レキシカルクロージャとも呼ばれます。 3 00:00:06,800 --> 00:00:08,720 ブロックは Pharo のあらゆる所で使われています。 4 00:00:08,880 --> 00:00:12,160 ブロックはループや条件分岐やイテレーターの 基礎となっています。 5 00:00:12,320 --> 00:00:14,680 GUIや専用言語の基礎でもあります。 6 00:00:14,840 --> 00:00:17,120 ブロックはシステムの心臓部なのです。 7 00:00:17,280 --> 00:00:21,280 Java では最近のバージョンでしか 導入されていません。 8 00:00:23,000 --> 00:00:27,400 ブロックを定義するためには 角括弧を使います。 9 00:00:27,560 --> 00:00:28,920 ここに例があります。 10 00:00:29,080 --> 00:00:32,760 [expressions...] 11 00:00:34,840 --> 00:00:37,840 ブロックの定義についてお話します。 12 00:00:38,000 --> 00:00:40,000 別の例です。 13 00:00:40,160 --> 00:00:42,840 この表現式 1/0 は 14 00:00:43,000 --> 00:00:46,760 実行されるとエラーになります。 15 00:00:47,760 --> 00:00:50,600 この式をブロックに隠蔽して 16 00:00:50,760 --> 00:00:54,920 表現式 1/0 を持つブロックを定義しましょう。 17 00:00:55,080 --> 00:01:00,040 このブロック定義を評価しても何も起こりません。 エラーも発生しません。 18 00:01:00,200 --> 00:01:02,400 ブロックを返します。 19 00:01:02,560 --> 00:01:06,160 ブロックの定義はその本体を実行しません。 20 00:01:07,720 --> 00:01:11,480 沢山のブロックを好きなだけ定義することができます。 21 00:01:11,640 --> 00:01:14,240 本体の表現式は凍結されています。 22 00:01:15,240 --> 00:01:18,560 ブロックとその本体の表現式を評価するためには 23 00:01:18,720 --> 00:01:21,760 value メッセージで明示的に行う必要があります。 24 00:01:21,920 --> 00:01:24,520 例えば、このブロック [2 + 6] 25 00:01:24,680 --> 00:01:26,640 これに value メッセージを送ります。 26 00:01:26,800 --> 00:01:29,760 本体の表現式が評価されます。 27 00:01:29,920 --> 00:01:33,360 結果が返ってきます。 8です。 28 00:01:34,320 --> 00:01:37,760 しかし ブロックがエラーを起こす表現式を持っている場合 29 00:01:37,920 --> 00:01:40,960 ブロックが評価された時に エラーが返ってきます。 30 00:01:41,120 --> 00:01:42,720 例2にある通りです。 31 00:01:42,880 --> 00:01:46,560 [1/0] このブロックに value メッセージを送ると 32 00:01:46,720 --> 00:01:48,400 エラーが返ってきます。 33 00:01:49,760 --> 00:01:52,960 ブロックは引数を取ることもできます。 34 00:01:53,120 --> 00:01:56,240 メソッドのように。 35 00:01:56,400 --> 00:02:01,400 ブロックは常に [ で始まり 36 00:02:01,560 --> 00:02:03,120 ] で閉じられます。 37 00:02:03,280 --> 00:02:08,360 引数は接頭辞としてコロンがつけられます。 38 00:02:08,520 --> 00:02:11,760 次に | つまりパイプ(縦棒)がきます。 39 00:02:11,920 --> 00:02:16,240 パイプは引数宣言をブロックの本体から分離します。 40 00:02:16,400 --> 00:02:18,200 そして表現式が続きます。 41 00:02:18,360 --> 00:02:21,560 この例では引数は x です。 42 00:02:21,720 --> 00:02:24,360 x + 2 がこのブロックの唯一の表現式です。 43 00:02:24,520 --> 00:02:27,120 このブロックを評価するためには 44 00:02:27,280 --> 00:02:31,040 value: メッセージに引数をつけて送ります。 45 00:02:31,200 --> 00:02:35,600 引数 x に 5 を渡して 46 00:02:35,760 --> 00:02:38,560 ブロックの表現式が評価されます。 47 00:02:38,720 --> 00:02:42,880 このブロックに value: 5 メッセージを送ると 48 00:02:43,040 --> 00:02:44,400 7 が返ってきます。 49 00:02:44,560 --> 00:02:48,160 x を 5 として ブロックが評価されるからです。 50 00:02:48,800 --> 00:02:50,680 この例は前の例と似ていますが 51 00:02:50,840 --> 00:02:55,200 1つのブロックに複数の表現式が入っています。 52 00:02:55,360 --> 00:02:58,720 ここでは2つ。 x+33 と x+2 です。 53 00:02:58,880 --> 00:03:01,400 value: 5 を送ると 54 00:03:01,560 --> 00:03:04,680 ブロックの表現式が評価されて 55 00:03:04,840 --> 00:03:07,600 返り値が返ってきますが 56 00:03:07,760 --> 00:03:12,120 ブロックの最後の表現式の値のみ 57 00:03:12,280 --> 00:03:16,200 つまり x + 2 の結果のみが返ってきます。 58 00:03:16,960 --> 00:03:17,960 7 です。 59 00:03:19,640 --> 00:03:22,480 Pharo ではブロックは通常のオブジェクトです。 60 00:03:22,640 --> 00:03:25,120 ブロックを一時変数に格納することができます。 61 00:03:25,280 --> 00:03:28,160 ブロックにメッセージを送ることができます。 通常のオブジェクトのように。 62 00:03:28,320 --> 00:03:31,120 ここに例があります。 63 00:03:31,280 --> 00:03:35,160 このブロックの定義 x + 2 を 64 00:03:35,320 --> 00:03:37,080 変数 add2 に格納することができます。 65 00:03:37,240 --> 00:03:40,680 そして何回かこのブロックを評価するために メッセージを投げます。 66 00:03:40,840 --> 00:03:43,000 まずはvalue:メッセージを投げます。 67 00:03:43,160 --> 00:03:46,640 5を引数として評価して 7が返ってきます。 68 00:03:46,800 --> 00:03:49,720 そして value: 33 メッセージです。 69 00:03:49,880 --> 00:03:51,920 35が返ってきます。 70 00:03:52,080 --> 00:03:55,800 複数の引数を持つブロックを定義することもできます。 71 00:03:55,960 --> 00:04:00,720 例えば x と y です。 このブロックは2つの引数を持ちます。 72 00:04:00,880 --> 00:04:05,160 しかしこのブロックをどうやって評価するのでしょうか? 73 00:04:05,320 --> 00:04:09,840 評価を開始するには2つの値を渡す必要があります。 74 00:04:10,000 --> 00:04:13,200 x と y としてそれぞれ 5 と 7 を渡すには? 75 00:04:13,840 --> 00:04:19,040 答えは value:value: メッセージです。 76 00:04:19,760 --> 00:04:22,760 ブロックのクラスのメソッドです。 77 00:04:22,920 --> 00:04:28,080 x が 5、y が 7として 78 00:04:28,240 --> 00:04:29,880 12が返ってきます。 79 00:04:32,880 --> 00:04:36,960 メソッドと同様に ブロックにも一時変数を定義できます。 80 00:04:37,120 --> 00:04:40,680 この例は 81 00:04:40,840 --> 00:04:43,360 Collectionクラスからの実例です。 82 00:04:43,520 --> 00:04:47,880 ブロックはここから始まって ここで終わります。 83 00:04:48,880 --> 00:04:52,800 一つの引数 index を取ります。 84 00:04:53,800 --> 00:04:57,520 2つの | に挟まれて1つの一時変数があります。 85 00:04:57,680 --> 00:04:58,960 args です。 86 00:04:59,760 --> 00:05:02,200 この一時変数 args は 87 00:05:02,360 --> 00:05:07,160 ブロックの表現式を評価している間だけ存在します。 88 00:05:09,080 --> 00:05:11,920 ブロックはメソッドの中で定義されます。 89 00:05:12,080 --> 00:05:16,240 ブロックの中でもリターンを使うことができます。 90 00:05:16,400 --> 00:05:20,600 これは Integer クラスからの例です。 91 00:05:20,760 --> 00:05:23,280 これは factorial メソッドです。 92 00:05:24,040 --> 00:05:27,960 このメソッドにはいくつかのブロックがあります。 93 00:05:28,120 --> 00:05:31,760 これらのブロックにはリターン(^)があります。 94 00:05:31,920 --> 00:05:35,720 リターンは factorial メソッドから脱出します。 95 00:05:35,880 --> 00:05:39,600 例えば 0 に factorial メッセージを送ると 96 00:05:39,760 --> 00:05:41,640 1 が返ってきます。 97 00:05:41,800 --> 00:05:46,880 この答えが得られるのは、ブロックの最初の ^ があるからです。 98 00:05:47,040 --> 00:05:49,640 ここで factorial メソッドから脱出しています。 99 00:05:49,800 --> 00:05:52,920 ブロックの中にあるリターンは そのブロックを定義しているメソッドから 100 00:05:53,080 --> 00:05:54,960 脱出します。 101 00:05:56,680 --> 00:05:59,360 ブロックを使う上でのアドバイスが1つあります。 102 00:05:59,520 --> 00:06:02,400 ブロックはとても強力な要素です。 103 00:06:02,560 --> 00:06:04,480 注意深く使ってください。 104 00:06:04,640 --> 00:06:08,440 1つに2つか3つ以上の引数を持たせないこと。 105 00:06:08,600 --> 00:06:11,320 もしそれを超える引数を持たせたら 読解不能になります。 106 00:06:11,480 --> 00:06:15,280 インスタンス変数とメソッドがあるクラスを 定義したほうが良いです。 107 00:06:15,440 --> 00:06:17,200 そのほうがずっと読み易いです。 108 00:06:17,960 --> 00:06:22,160 このコースではブロックを学びました。 ブロックの構文 109 00:06:22,320 --> 00:06:25,600 ある種の匿名メソッドであること 110 00:06:25,760 --> 00:06:27,800 つまりレキシカルクロージャだということ 111 00:06:27,960 --> 00:06:31,960 他のオブジェクト同様に 変数に格納できること。 112 00:06:32,120 --> 00:06:37,400 別のレッスンでは ブロックが沢山の言語機能の基礎になっている 113 00:06:37,560 --> 00:06:40,440 ことを学びます。 ループやイテレーション等です。