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ライブラリを使いたい」なんて時にはこれで対応できます。