bind

何かの変更を何かに伝える時はどうするか?

JavaFXだとbindキーワードが使えます
ここら辺から、だんだんとサンプルコードが長くなってくるかも・・・

var num = 10;
var mul = bind num * num;
println("mul = {mul}");

num = 20;
println("mul = {mul}");

初めのprintln文では10*10の100が表示されます
で、二つめのprintln文では400が表示されます
これはbindキーワードがきいています

var mul = bind num * num;

はnum変数の変化と共にmulの値が計算され直してmulに入る
つまりnum = 20でmulの値に変化が起きたので計算され直すと言うことですね

もう少し詰めていきましょう
今は変数にbindしましたがオブジェクトにもbindできます

class Person {
    var age: Integer;
}

var a = 27;
var p = bind Person {
    age: a
}

println("age = {p.age}");
println(p);
a = 28;
println("age = {p.age}");
println(p);

表示結果としては、初めのprintlnで「age = 27」、その後にaを28に変更しているので2度目のprintln文では「age = 28」が表示されます
しかし、オブジェクトにbindするとオブジェクトの値が変更される度にオブジェクトを生成し直してしまいます
これでは頻繁に更新する処理では重くなってしまう可能性があります(クライアントサイドなので多少処理が重くても平気っちゃ平気なんですが・・・)

じゃ、どうするかっていうことですが
変数pにオブジェクトをバインドしているところをちょっと変えます

var p = bind Person {
    age: bind a
}

age: bind aとすることでオブジェクトを再生成しなくなります
また、次のようにPersonオブジェクトからbindキーワードをとっても平気です

var p = Person {
    age: bind a
}