1

C 拡張クラスのインスタンスを 1 つだけ作成できるようにしたかったので、singleton モジュールを含めたいと思いました。

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 つのインスタンスのみを許可するようにすることもできたようです。または、マウス関連のメソッドをモジュールに入れるだけです...それは意味がありますか?

4

1 に答える 1

0

http://www.groupsrv.com/computers/about105620.htmlによると、これrb_include_module()は実際には単なる Module#append_features です。

どうやらand をModule#include呼び出します。したがって、C コードでは も呼び出す必要があります。明らかに何か重要なことがそこで起こります。Module#append_featuresModule#includedincluded

于 2010-07-16T01:59:27.740 に答える