このセッションでは Pharo でのループについてお話します。
Pharo では ループはオブジェクトへのメッセージです。
ループには様々な種類がありますが
それらは数やコレクションや
ブロックへのメッセージです。
コレクションの要素を数え上げる イテレータの場合もあります。
これがその例です。
timesRepeat: メッセージを
整数 4 へ送ります。
引数としてブロックを渡します。
ブロックについては 前のセッションで学びました。
ブロックはここから始まってここで終わります。
このメッセージはこのブロックを
何回か、この場合は4回、評価します。
レシーバが 4 だからです。
ループを作るメッセージは他にもあります。
この例では to:do: です。
to:do: メッセージは Numberクラスで定義されています。
この場合も引数としてブロックを渡します。
このメッセージの最後の引数としてです。
このブロックは何回か
ループ変数を伴って評価されます。 ループ変数はレシーバーから
メッセージの第一引数の値までの値を取ります。
例えば
丁度こんな例題があります。
整数 1 に to:do: メッセージを送ります。
ブロックの中では ブロックの引数を表示します。
ループでの各 i の値です。
Transcript に 1から100までの全ての整数が表示されます。
他にもループを作るメッセージがあります。
例えば to:by:do: メッセージです。
1以外の増分でループすることができます。
増分の大きさを制御することができるのです。
この例ではループするごとに 3 ずつ増えていきます。
i は 3 ずつの増分の値を取ります。
このコード片を実行した時に 何が起こるでしょうか。
i が 1 から 100 まで
3 ずつの増分で進むのがわかるでしょう。
イテレーターもループを作ります。
コレクションのイテレーターはコレクションに送られるメッセージです。
あらゆる種類のコレクションにあります。
色々な種類のイテレーターがあります。 例えば do: です。
do: はコレクションの各要素を数え上げます。
collect: もコレクションの要素を数え上げますが
結果を集めて
新しいコレクションとします。
select: はコレクションの中から マッチする要素を選択します。
選択された要素からなる 新しいコレクションを作ります。
reject: はコレクションの要素から 必要ないものを取り除いたコレクションを作ります。
detect: はコレクションの中に 特定の要素が存在するかどうかを
見定める等のことに使われます。
次のスライドで これらのうちいくつかを学びましょう。
例えば do: は最も一般的なメッセージです。
コレクションに do: メッセージを ブロックを引数として送ります。
各ループでは
ブロックの引数 each は
コレクションの最初の要素を受け取り
次に2番目の要素、という具合に 最後の要素まで繰り返していきます。
これが例です。 コレクションが定義されています。
構文の復習です。
#( から ) の部分はコレクションのリテラルです。
このコレクションは4つの整数を格納しています。 15、10、19 そして 68 です。
do: メッセージをコレクションに ブロックを引数として送ります。
i はブロックの引数で
最初はまず 15 を
次に 10、19、そして68 を受け取ります。
また別のメッセージもあります。 whileTrue: です。
whileTrue: もループを作ります。
ただしブロックに送るメッセージです。
Blockクラスで定義されています。
これがレシーバーのブロックです。
こちらには引数のブロックがあります。
Colorクラスからの実例をお見せします。
これが whileTrue: です。
レシーバーのブロックには 条件が書かれています。
このブロックを評価すると true または false になります。
レシーバーである最初のブロックの評価結果に応じて
引数である2番目のブロックを
実行するかどうかが決まります。
これは別の whileTrue です。
この whileTrue は引数なしのメソッドです。
この whileTrue はレシーバーのブロックを評価して
true または false に応じて
また評価するかどうかを決めます。
評価結果が true であり続ける限りずっと ブロックが再評価されます。
whileTrue の双子のメッセージに whuileFalse があります。
それぞれ引数のあるものと ないものがあります。
クラスやブロックによって 様々なバリエーションがあります。
まとめると このコースでは
Pharo ではループが通常のメッセージとして 表現されることを見てきました。
それらのメッセージはオブジェクトに送られます。
整数はコレクションやブロックなど。
それらを使って実に様々なループを 作ることができます。
その気になれば あなたが新しいループを追加することもできます。