このセッションで扱うのは
括弧と角括弧の使い方です。
これらを混同しないでください。
括弧は表現式やコードの中での
実行の優先順位を変えます。
一方で 角括弧はブロックを定義します。
ブロックの中に表現式が定義されている場合 それらの表現式は実行されていません。
実行を制御することができます。 ブロックに value メッセージを送ることで
その表現式の実行を開始します。
角括弧を使うべき場合について もう一度説明します。
あるいくつかの表現式について 実行するかどうかわからない時に
それらの表現式を角括弧で囲みます。
例えば、if 式に使いますか？ 分岐になっていますか？
表現式を何回評価するかわからない場合も
角括弧を使って
ブロックにします。
例えば n timesRepeat: [self doSomething]
self doSomething はブロックの中に隠蔽されています。
なぜかというと その表現式を何度も実行しなければならないからです。
ブロックの中に入れて 何回も value メッセージを送らなければなりません。
もう1つの例では ifTrue: メッセージを送ります。
レシーバ次第で
つまりこの表現式が true か false かによって
表現式 self doSomething を 実行したりしなかったりします。
ここで括弧は使えません。 実行すべきでない場合もあるからです。
その表現式をブロックに入れれば
value メッセージを送るかどうかを あなたが決めることができます。
whileTrue: でも同じことです。
レシーバとなるブロックがあり 引数となるブロックを渡します。
レシーバのブロックの評価が 真偽値の true と false のどちらを返すかによって
1度だけ実行したり、複数回実行したり 全く実行しなかったりします。
表現式 self doSomething は ブロックの中でなければならないのです。
小問題をやってみましょう。
問題は次の2つの表現式です。
1 から n まで self doSomething を繰り返す。
括弧と角括弧のどちらを使うべきでしょう？
x が空であれば self doSomething をする。
括弧と角括弧のどちらを使うべきでしょう？
では正解を教えます。
どちらの場合も角括弧を使います。
1問目の場合 self doSomething を繰り返したいわけです。
このブロックに value メッセージを 何回か送らなければなりません。
2問目の場合 x ifEmpty: ですが
もし x が空でない場合には self doSomething を実行すべきではありません。
もし x が空の場合には self doSomething を実行しなければなりません。
まとめると このコースでは
括弧と角括弧を混同してはいけないことを 学びました。
括弧は表現式を計算する順序を 変えるためのもので
角括弧は表現式を
凍結させて
その実行を制御するためのものです。 複数回実行することもあります。