1 00:00:00,640 --> 00:00:03,600 このセッションでは Pharo でのループについてお話します。 2 00:00:03,760 --> 00:00:08,320 Pharo では ループはオブジェクトへのメッセージです。 3 00:00:08,480 --> 00:00:10,680 ループには様々な種類がありますが 4 00:00:11,320 --> 00:00:14,680 それらは数やコレクションや 5 00:00:14,840 --> 00:00:16,360 ブロックへのメッセージです。 6 00:00:16,520 --> 00:00:21,040 コレクションの要素を数え上げる イテレータの場合もあります。 7 00:00:22,080 --> 00:00:23,600 これがその例です。 8 00:00:23,760 --> 00:00:27,240 timesRepeat: メッセージを 9 00:00:27,400 --> 00:00:29,000 整数 4 へ送ります。 10 00:00:29,160 --> 00:00:31,640 引数としてブロックを渡します。 11 00:00:31,800 --> 00:00:34,480 ブロックについては 前のセッションで学びました。 12 00:00:34,640 --> 00:00:38,400 ブロックはここから始まってここで終わります。 13 00:00:39,080 --> 00:00:43,520 このメッセージはこのブロックを 14 00:00:44,120 --> 00:00:46,960 何回か、この場合は4回、評価します。 15 00:00:47,120 --> 00:00:48,840 レシーバが 4 だからです。 16 00:00:50,720 --> 00:00:54,080 ループを作るメッセージは他にもあります。 17 00:00:54,240 --> 00:00:57,000 この例では to:do: です。 18 00:00:57,160 --> 00:01:00,360 to:do: メッセージは Numberクラスで定義されています。 19 00:01:01,520 --> 00:01:04,360 この場合も引数としてブロックを渡します。 20 00:01:04,520 --> 00:01:06,400 このメッセージの最後の引数としてです。 21 00:01:06,560 --> 00:01:09,440 このブロックは何回か 22 00:01:09,600 --> 00:01:13,640 ループ変数を伴って評価されます。 ループ変数はレシーバーから 23 00:01:13,800 --> 00:01:16,320 メッセージの第一引数の値までの値を取ります。 24 00:01:17,800 --> 00:01:19,960 例えば 25 00:01:20,120 --> 00:01:23,080 丁度こんな例題があります。 26 00:01:23,240 --> 00:01:26,360 整数 1 に to:do: メッセージを送ります。 27 00:01:27,160 --> 00:01:31,840 ブロックの中では ブロックの引数を表示します。 28 00:01:32,000 --> 00:01:34,080 ループでの各 i の値です。 29 00:01:34,240 --> 00:01:39,200 Transcript に 1から100までの全ての整数が表示されます。 30 00:01:42,000 --> 00:01:47,120 他にもループを作るメッセージがあります。 31 00:01:47,280 --> 00:01:50,280 例えば to:by:do: メッセージです。 32 00:01:50,440 --> 00:01:52,440 1以外の増分でループすることができます。 33 00:01:52,600 --> 00:01:55,680 増分の大きさを制御することができるのです。 34 00:01:55,840 --> 00:01:58,040 この例ではループするごとに 3 ずつ増えていきます。 35 00:01:58,200 --> 00:02:02,160 i は 3 ずつの増分の値を取ります。 36 00:02:03,920 --> 00:02:08,080 このコード片を実行した時に 何が起こるでしょうか。 37 00:02:08,240 --> 00:02:12,040 i が 1 から 100 まで 38 00:02:12,200 --> 00:02:14,400 3 ずつの増分で進むのがわかるでしょう。 39 00:02:15,880 --> 00:02:18,920 イテレーターもループを作ります。 40 00:02:19,080 --> 00:02:23,360 コレクションのイテレーターはコレクションに送られるメッセージです。 41 00:02:23,520 --> 00:02:25,000 あらゆる種類のコレクションにあります。 42 00:02:25,160 --> 00:02:28,440 色々な種類のイテレーターがあります。 例えば do: です。 43 00:02:28,600 --> 00:02:31,880 do: はコレクションの各要素を数え上げます。 44 00:02:32,040 --> 00:02:35,400 collect: もコレクションの要素を数え上げますが 45 00:02:35,560 --> 00:02:39,040 結果を集めて 46 00:02:39,200 --> 00:02:41,040 新しいコレクションとします。 47 00:02:41,200 --> 00:02:45,560 select: はコレクションの中から マッチする要素を選択します。 48 00:02:45,720 --> 00:02:48,720 選択された要素からなる 新しいコレクションを作ります。 49 00:02:48,880 --> 00:02:53,280 reject: はコレクションの要素から 必要ないものを取り除いたコレクションを作ります。 50 00:02:53,440 --> 00:02:56,320 detect: はコレクションの中に 特定の要素が存在するかどうかを 51 00:02:56,480 --> 00:03:00,120 見定める等のことに使われます。 52 00:03:00,280 --> 00:03:03,360 次のスライドで これらのうちいくつかを学びましょう。 53 00:03:04,200 --> 00:03:08,440 例えば do: は最も一般的なメッセージです。 54 00:03:08,600 --> 00:03:13,000 コレクションに do: メッセージを ブロックを引数として送ります。 55 00:03:13,160 --> 00:03:16,240 各ループでは 56 00:03:16,400 --> 00:03:19,160 ブロックの引数 each は 57 00:03:19,320 --> 00:03:22,200 コレクションの最初の要素を受け取り 58 00:03:22,360 --> 00:03:26,000 次に2番目の要素、という具合に 最後の要素まで繰り返していきます。 59 00:03:28,280 --> 00:03:31,680 これが例です。 コレクションが定義されています。 60 00:03:31,840 --> 00:03:34,200 構文の復習です。 61 00:03:34,360 --> 00:03:37,080 #( から ) の部分はコレクションのリテラルです。 62 00:03:37,240 --> 00:03:42,120 このコレクションは4つの整数を格納しています。 15、10、19 そして 68 です。 63 00:03:42,280 --> 00:03:46,320 do: メッセージをコレクションに ブロックを引数として送ります。 64 00:03:46,480 --> 00:03:51,000 i はブロックの引数で 65 00:03:51,160 --> 00:03:53,560 最初はまず 15 を 66 00:03:53,720 --> 00:03:56,120 次に 10、19、そして68 を受け取ります。 67 00:03:59,040 --> 00:04:01,680 また別のメッセージもあります。 whileTrue: です。 68 00:04:01,840 --> 00:04:04,680 whileTrue: もループを作ります。 69 00:04:04,840 --> 00:04:07,640 ただしブロックに送るメッセージです。 70 00:04:07,800 --> 00:04:09,800 Blockクラスで定義されています。 71 00:04:09,960 --> 00:04:12,480 これがレシーバーのブロックです。 72 00:04:12,640 --> 00:04:14,720 こちらには引数のブロックがあります。 73 00:04:15,320 --> 00:04:19,320 Colorクラスからの実例をお見せします。 74 00:04:19,480 --> 00:04:22,120 これが whileTrue: です。 75 00:04:22,760 --> 00:04:25,800 レシーバーのブロックには 条件が書かれています。 76 00:04:25,960 --> 00:04:28,560 このブロックを評価すると true または false になります。 77 00:04:28,720 --> 00:04:32,200 レシーバーである最初のブロックの評価結果に応じて 78 00:04:32,360 --> 00:04:34,800 引数である2番目のブロックを 79 00:04:34,960 --> 00:04:38,600 実行するかどうかが決まります。 80 00:04:39,520 --> 00:04:42,080 これは別の whileTrue です。 81 00:04:42,240 --> 00:04:46,480 この whileTrue は引数なしのメソッドです。 82 00:04:46,640 --> 00:04:50,280 この whileTrue はレシーバーのブロックを評価して 83 00:04:50,440 --> 00:04:52,920 true または false に応じて 84 00:04:53,080 --> 00:04:55,800 また評価するかどうかを決めます。 85 00:04:55,960 --> 00:04:59,240 評価結果が true であり続ける限りずっと ブロックが再評価されます。 86 00:05:00,840 --> 00:05:04,960 whileTrue の双子のメッセージに whuileFalse があります。 87 00:05:05,120 --> 00:05:07,440 それぞれ引数のあるものと ないものがあります。 88 00:05:07,600 --> 00:05:12,120 クラスやブロックによって 様々なバリエーションがあります。 89 00:05:14,160 --> 00:05:16,640 まとめると このコースでは 90 00:05:16,800 --> 00:05:20,840 Pharo ではループが通常のメッセージとして 表現されることを見てきました。 91 00:05:21,000 --> 00:05:22,440 それらのメッセージはオブジェクトに送られます。 92 00:05:22,600 --> 00:05:27,560 整数はコレクションやブロックなど。 93 00:05:28,280 --> 00:05:32,400 それらを使って実に様々なループを 作ることができます。 94 00:05:32,560 --> 00:05:34,680 その気になれば あなたが新しいループを追加することもできます。