代码之家  ›  专栏  ›  技术社区  ›  Steven Lu

使用Singleton的Ruby C扩展

  •  1
  • Steven Lu  · 技术社区  · 14 年前

    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

    而且,我似乎可以保持我的扩展尽可能简单,只是黑客某种接口以后,以确保我只允许一个实例。或者把鼠标相关的方法放到一个模块里。。。这些有道理吗?

    1 回复  |  直到 12 年前
        1
  •  0
  •   Steven Lu    14 年前

    根据 http://www.groupsrv.com/computers/about105620.html 这个 rb_include_module() 实际上只是模块附加功能。

    显然 Module#include Module#append_features Module#included included . 因为很明显那里发生了一些重要的事情。