サイログ。

~雑多な記事置き場~

なんやぁ、そういうことか

で、東京への新幹線の中で、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と同じディレクトリにコピー。

それから、呼び出し用のRubyスクリプトを作成・・・

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本体には入りませんが)

・・・といいますか、これで合ってますよね?