ブロック
ブロックの概念
mongooseでは、関数呼び出し時のブロックはイベントハンドラとして扱われます。
ブロックは、呼び出された際に、必ず規定の引数$resultを受け取ります。
与えられた回数分繰り返す組み込み関数loopを例にとってみます。
例:
# 1 ~ 10までの数字を表示
loop(10){ # 10回繰り返し
$result++; # $resultはloopから渡される現在の繰り返し回数(0~)を、+1
print($result); # printは与えられた値を文字列にして表示。
}
イベント発行の方法
定義した関数から、ブロックを呼び出すには、wakeup()を利用します。
wakeup()は、呼び出し元でブロックが定義されていなければ、何もせずに戻ります。
例:
# イベント発行だけをするユーザ関数
function do_event(){
wakeup("arg1", "arg2"); # イベント発行。(引数でイベントハンドラに渡す値を指定する)
}
# 関数呼び出し(イベントハンドラ無し)
do_event();
# 関数呼び出し(イベントハンドラ有り)
do_event(){
println($result[0]); // arg1が表示される
println($result[1]); // arg2が表示される
println("イベントが発行されました。");
}
ブロック内での変数のスコープ
ブロックは、呼び出し先の関数を親に持ち、親の親までの変数を参照することが出来ます。
例:
function do_event(){
wakeup(); # イベント発行。(引数でイベントハンドラに渡す値を指定する)
}
A = 1; # 変数Aに1を代入
do_event(){ # 関数呼び出し
print(A); # ここではAを参照可能(表示は1)
B = 2; # 変数Bに2を代入
C = A; # 変数Cに変数Aの値を代入
do_event(){ # 関数呼び出し
print(A); # ここではAが参照不可(表示はnull)
print(B); # Bは参照可能(表示は2)
print(C); # Cは参照可能(表示は1)
}
}
ブロックのライフタイム
ブロックは、関数呼び出し時に作成され、関数呼び出しが終了するまで生き続けます。
イベント発行の度に作成されるわけではありません
ブロック内で設定した変数の値は、次回のイベント発行時に引き継がれます。
