急に取っかかりを得た.
「そういえばクロージャって何だっけ」
「確かD言語にはまだクロージャないよなー」
「関数が定義されたスコープにあるインスタンスにアクセスできるのか」
「あ,それがいわゆる環境持ち運べるってことじゃん」
そうか! クロージャだ!
DFLのイベントハンドラはC#のように ~= で追加連結するようになっているんだけど,それをC#と同じように,
auto list = new ListBox; auto button = new Button; button.click ~= (Object o, EventArgs args) { list.items.add("Hello"); list.items.add("World"); };
のように書いていて,動かなくて,はまっていた.
これじゃダメだこれじゃダメだこれじゃダメだ(ry ←映画化記念
D言語にはまだクロージャがないんだから,この無名デリゲートの中から外のスコープにあるlistへはアクセスできないじゃんか.
だから,
auto list = new ListBox; auto button = new MyButton(list); // MyButtonクラスにlistへの参照を保持しておかなければいけない class MyButton : Button { this(ListBox list) { listBox = list; } override void onClick() { listBox.items.add("Hello"); listBox.items.add("World"); } ListBox listBox; }
のようにしなきゃいけなかったのか.
なるほどなるほど.
確かにクロージャがないと不便だわ.