なんやぁ、そういうことか
で、東京への新幹線の中で、Rubyの拡張ライブラリを試していたわけですよ。
しっかし、なんで、モジュール関数の追加は予想できるのに、README.ext.jpにはモジュールの呼び出しが無いのか・・・ン?
もしかして、Rubyスクリプトの場合と同じで、なーんも考えずにrb_create_moduleすればいいのか?
というわけで、コードを組んでみました。
#include "ruby.h"
VALUE mMiyako;
static VALUE testX(VALUE self)
{
printf("ok.\n");
return self;
}void Init_test_x()
{
mMiyako = rb_create_module("Miyako");
rb_define_module_function(mMiyako, "test_x", test_x, 0);
}
ほいで、これをtest_x.cで保存。
コンパイルしてできたtest_x.soをmiyako.rbと同じディレクトリにコピー。
require 'miyako'
require 'test_x'puts Miyako::version
Miyako::test_x
えいやっと、そのスクリプトを動かしてみると・・・
Miyako v1.0
ok.
そぉいうことかぁぁぁぁぁ!!!!!
嗚呼、これで分かったよ。難しく考えることは無かったんやん。
更に、モジュール変数は呼び出せるのかなぁ、と思ったら、
VALUE mMiyako = rb_create_module("Miyako");
VALUE mScreen = rb_create_module_under(mMiyako,"Screen");VALUE iScreen = rb_ivar_get(mScreen,rb_intern("@@screen"))
rb_funcall(iScreen, rb_intern("w"), 0, NULL);
これで、Miyako::Screenモジュールのモジュール変数@@screenのwメソッドを呼び出せるわけですね。
うーん、思ったより簡単やなぁ。
あとは、VALUE型をもうすこし理解すれば、Miyakoの拡張もできるかもね。
(もちろん、Miyako本体には入りませんが)
・・・といいますか、これで合ってますよね?