...ing logging 4.0

はてなブログに移行しました。D言語の話とかいろいろ。

Closure

急に取っかかりを得た.


「そういえばクロージャって何だっけ」
「確か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;
}

のようにしなきゃいけなかったのか.
なるほどなるほど.
確かにクロージャがないと不便だわ.