包含方法作为值的Gee HashMap

时间:2011-05-26 22:00:14

标签: vala genie gee

我正在尝试填充一个Libgee HashMap,其中每个条目都有一个字符串作为键,一个函数作为值。这可能吗?我想要这样的事情:

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 个答案:

答案 0 :(得分:5)

代表是您正在寻找的。但是上次我检查时,泛型不支持代理,所以一个不那么优雅的方式是包装它:

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);

答案 1 :(得分:2)

只有具有[CCode(has_target = false)]的代理才有可能,否则你必须像takoi建议的那样创建一个包装器。