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