我只想允许创建我的 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初学者在这里。
此外,我似乎可以让我的扩展尽可能简单,然后再破解某种接口以确保我只允许一个实例。或者只是将我的鼠标相关方法放入一个模块中......任何有意义吗?