すごくメモ帳

すごくほぼメモ帳ぐらいなブログ

Rubyの拡張ライブラリー入門シリーズ④ (RubyとCの整数変換: (INT2FIX, FIX2INT))

VALUE

よくRubyソースコードに出てくるVALUEですが、これはRubyで値を扱うための型です。 Rubyで扱う情報はこのVALUEの中に存在しています。 しかし、VALUEC言語の型のように計算・処理ができないため、一度intdoubleなどに変換したり、関数を用いてVALUEの情報を扱います。

つまり、VALUEintdouble → 計算 → intdoubleVALUE

といった感じです。

(VALUEの実態はruby.htypedef unsigned long VALUE;と定義されています。)

数値の変換

FIX2INT

FIX2INTRubyでいうところのFixnumオブジェクトをC言語int型に変換するマクロです。 (FixnumがIntergerに統合されたとかで詳しくはよくわかりません。とりあえず、大きすぎない数値なら問題ないようです。)

https://docs.ruby-lang.org/ja/latest/function/FIX2INT.html

INT2FIX

int型をRubyでいうところのFixnumオブジェクトに変換するマクロです。

https://docs.ruby-lang.org/ja/latest/function/INT2FIX.html

サンプルプログラム

1を足すプログラム

#include <ruby.h>

VALUE rb_cTest;

static VALUE
rb_obj_func(VALUE self, VALUE n){
    int a;
    a = FIX2INT(n);
    a += 1;
    return INT2FIX(a);
}

void Init_Test(void){
    rb_define_method(rb_cObject, "func", rb_obj_func, 1);
}
# extconf.rb
require 'mkmf'
create_makefile "Test"
# sh
ruby extconf.rb
make
# 実行
require "./Test"
p func(1) # 2