Расширение Ruby C с использованием Singleton - PullRequest
1 голос
/ 11 июля 2010

Я хотел разрешить создание только одного экземпляра моего класса расширений 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 новичок здесь.

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

1 Ответ

0 голосов
/ 16 июля 2010

в соответствии с http://www.groupsrv.com/computers/about105620.html rb_include_module() на самом деле просто Module # append_features.

Видимо Module#include звонит Module#append_features и Module#included. Так что в нашем C-коде мы также должны назвать included. Очевидно, что там происходит что-то важное.

...