CでRubyモジュールを作る
PerlのXSがsoを読み込むPerlモジュールファイル(.pm)を必要とするのに比べて、Rubyのrequireは.soファイルを直接読み込んでくれるので、ちょっとばかり簡単です。
.soの作り方は、svn.ruby-lang.orgにあります。
CのコードはRubyのマクロをふんだんに使って記述します。
static VALUE rb_hello_c(self) VALUE self; { return rb_str_new2("Hello C"); } void Init_hoge() { VALUE rb_cHoge = rb_define_class("Hoge", rb_cObject); rb_define_alloc_func(rb_cHoge, rb_hoge_s_alloc); rb_define_private_method(rb_cHoge, "initialize", rb_hoge_initialize); rb_define_method(rb_cHoge, "hello_c", rb_hello_c); }
.soと.rbで同名の拡張モジュールにしたい場合は、.soと.rbを同じところにおき、.rb側に
◆hoge.rb require 'hoge.so' class Hoge def hello_rb "Hello Ruby" end end
と書けば、.rbが先に読み込まれ、続いて.soが読み込まれます。
◆hoge_test.rb require 'hoge' hoge = Hoge.new puts hoge.hello_c puts hoge.hello_rb
「クラス中のあるメソッドだけは、Cライブラリを使いたい」なんて時にはこれで対応できます。