1

我只想允许创建我的 C 扩展类的一个实例,所以我想包含单例模块。

void Init_mousetest() {
    VALUE mouseclass = rb_define_class("MyMouse",rb_cObject);
    rb_require("singleton");
    VALUE singletonmodule = rb_const_get(rb_cObject,rb_intern("Singleton"));
    rb_include_module(mouseclass,singletonmodule);

    rb_funcall(singletonmodule,rb_intern("included"),1,mouseclass);
### ^ Why do I need this line here?

    rb_define_method(mouseclass,"run",method_run,0);
    rb_define_method(mouseclass,"spawn",method_spawn,0);
    rb_define_method(mouseclass,"stop",method_stop,0);
}

据我了解,该行的作用与 相同Singleton.included(MyMouse),但如果我尝试调用它,我会得到

irb(main):006:0> Singleton.included(MyMouse)
NoMethodError: private method `included' called for Singleton:Module
        from (irb):6
        from C:/Ruby19/bin/irb:12:in `<main>'

为什么它的rb_include_module行为与我预期的不同?也赞赏任何切向的讨论/解释或相关文章。Ruby初学者在这里。

此外,我似乎可以让我的扩展尽可能简单,然后再破解某种接口以确保我只允许一个实例。或者只是将我的鼠标相关方法放入一个模块中......任何有意义吗?

4

1 回答 1

0

根据http://www.groupsrv.com/computers/about105620.htmlrb_include_module()实际上只是 Module#append_features 。

显然Module#include调用Module#append_featuresand Module#included。所以在我们的 C 代码中,我们还必须调用included. 因为显然那里发生了一些重要的事情。

于 2010-07-16T01:59:27.740 回答