Gee HashMap, содержащий методы в качестве значений - PullRequest
6 голосов
/ 27 мая 2011

Я пытаюсь заполнить HashMap Libgee, где каждая запись имеет строку в качестве ключа и функцию в качестве значения. Это возможно? Я хочу такие вещи:

var keybindings = new Gee.HashMap<string, function> ();
keybindings.set ("<control>h", this.show_help ());
keybindings.set ("<control>q", this.explode ());

чтобы я мог в итоге сделать что-то вроде этого:

foreach (var entry in keybindings.entries) {
    uint key_code;
    Gdk.ModifierType accelerator_mods;
    Gtk.accelerator_parse((string) entry.key, out key_code, out accelerator_mods);      
   accel_group.connect(key_code, accelerator_mods, Gtk.AccelFlags.VISIBLE, entry.value);
}

Но, возможно, это не лучший способ?

Ответы [ 2 ]

5 голосов
/ 27 мая 2011

Делегаты - это то, что вы ищете. Но в прошлый раз, когда я проверял, дженерики не поддерживали делегатов, поэтому не слишком элегантный способ обернуть его:

delegate void DelegateType();

private class DelegateWrapper {
    public DelegateType d;
    public DelegateWrapper(DelegateType d) {
        this.d = d;
    }
}

Gee.HashMap keybindings = new Gee.HashMap<string, DelegateWrapper> ();
keybindings.set ("<control>h", new DelegateWrapper(this.show_help));
keybindings.set ("<control>q", new DelegateWrapper(this.explode));

//then connect like you normally would do:
accel_group.connect(entry.value.d);
2 голосов
/ 28 мая 2011

Это возможно только для делегатов с [CCode (has_target = false)], в противном случае вам нужно создать оболочку, как и предложил такои.

...