このレッスンではブロックを紹介します。
ブロックはある種の匿名メソッドで レキシカルクロージャとも呼ばれます。
ブロックは Pharo のあらゆる所で使われています。
ブロックはループや条件分岐やイテレーターの 基礎となっています。
GUIや専用言語の基礎でもあります。
ブロックはシステムの心臓部なのです。
Java では最近のバージョンでしか 導入されていません。
ブロックを定義するためには 角括弧を使います。
ここに例があります。
[expressions...]
ブロックの定義についてお話します。
別の例です。
この表現式 1/0 は
実行されるとエラーになります。
この式をブロックに隠蔽して
表現式 1/0 を持つブロックを定義しましょう。
このブロック定義を評価しても何も起こりません。 エラーも発生しません。
ブロックを返します。
ブロックの定義はその本体を実行しません。
沢山のブロックを好きなだけ定義することができます。
本体の表現式は凍結されています。
ブロックとその本体の表現式を評価するためには
value メッセージで明示的に行う必要があります。
例えば、このブロック [2 + 6]
これに value メッセージを送ります。
本体の表現式が評価されます。
結果が返ってきます。 8です。
しかし ブロックがエラーを起こす表現式を持っている場合
ブロックが評価された時に エラーが返ってきます。
例2にある通りです。
[1/0] このブロックに value メッセージを送ると
エラーが返ってきます。
ブロックは引数を取ることもできます。
メソッドのように。
ブロックは常に [ で始まり
] で閉じられます。
引数は接頭辞としてコロンがつけられます。
次に | つまりパイプ(縦棒)がきます。
パイプは引数宣言をブロックの本体から分離します。
そして表現式が続きます。
この例では引数は x です。
x + 2 がこのブロックの唯一の表現式です。
このブロックを評価するためには
value: メッセージに引数をつけて送ります。
引数 x に 5 を渡して
ブロックの表現式が評価されます。
このブロックに value: 5 メッセージを送ると
7 が返ってきます。
x を 5 として ブロックが評価されるからです。
この例は前の例と似ていますが
1つのブロックに複数の表現式が入っています。
ここでは2つ。 x+33 と x+2 です。
value: 5 を送ると
ブロックの表現式が評価されて
返り値が返ってきますが
ブロックの最後の表現式の値のみ
つまり x + 2 の結果のみが返ってきます。
7 です。
Pharo ではブロックは通常のオブジェクトです。
ブロックを一時変数に格納することができます。
ブロックにメッセージを送ることができます。 通常のオブジェクトのように。
ここに例があります。
このブロックの定義 x + 2 を
変数 add2 に格納することができます。
そして何回かこのブロックを評価するために メッセージを投げます。
まずはvalue:メッセージを投げます。
5を引数として評価して 7が返ってきます。
そして value: 33 メッセージです。
35が返ってきます。
複数の引数を持つブロックを定義することもできます。
例えば x と y です。 このブロックは2つの引数を持ちます。
しかしこのブロックをどうやって評価するのでしょうか？
評価を開始するには2つの値を渡す必要があります。
x と y としてそれぞれ 5 と 7 を渡すには？
答えは value:value: メッセージです。
ブロックのクラスのメソッドです。
x が 5、y が 7として
12が返ってきます。
メソッドと同様に ブロックにも一時変数を定義できます。
この例は
Collectionクラスからの実例です。
ブロックはここから始まって ここで終わります。
一つの引数 index を取ります。
2つの | に挟まれて1つの一時変数があります。
args です。
この一時変数 args は
ブロックの表現式を評価している間だけ存在します。
ブロックはメソッドの中で定義されます。
ブロックの中でもリターンを使うことができます。
これは Integer クラスからの例です。
これは factorial メソッドです。
このメソッドにはいくつかのブロックがあります。
これらのブロックにはリターン(^)があります。
リターンは factorial メソッドから脱出します。
例えば 0 に factorial メッセージを送ると
1 が返ってきます。
この答えが得られるのは、ブロックの最初の ^ があるからです。
ここで factorial メソッドから脱出しています。
ブロックの中にあるリターンは そのブロックを定義しているメソッドから
脱出します。
ブロックを使う上でのアドバイスが1つあります。
ブロックはとても強力な要素です。
注意深く使ってください。
1つに2つか3つ以上の引数を持たせないこと。
もしそれを超える引数を持たせたら 読解不能になります。
インスタンス変数とメソッドがあるクラスを 定義したほうが良いです。
そのほうがずっと読み易いです。
このコースではブロックを学びました。 ブロックの構文
ある種の匿名メソッドであること
つまりレキシカルクロージャだということ
他のオブジェクト同様に 変数に格納できること。
別のレッスンでは ブロックが沢山の言語機能の基礎になっている
ことを学びます。 ループやイテレーション等です。