Я хотел разрешить создание только одного экземпляра моего класса расширений 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 новичок здесь.
Также кажется, что я мог бы просто сохранить свое расширение настолько простым, насколько это возможно, и просто взломать какой-то интерфейс позже, чтобы я разрешил только один экземпляр.Или просто поместите мои методы, связанные с мышью, в модуль ... Что-нибудь из этого имеет смысл?