Rubyの拡張ライブラリー入門シリーズ④ (RubyとCの整数変換: (INT2FIX, FIX2INT))
VALUE
よくRubyのソースコードに出てくるVALUE
ですが、これはRubyで値を扱うための型です。
Rubyで扱う情報はこのVALUE
の中に存在しています。
しかし、VALUE
はC言語の型のように計算・処理ができないため、一度int
やdouble
などに変換したり、関数を用いてVALUE
の情報を扱います。
つまり、VALUE
→ int
やdouble
→ 計算 → int
やdouble
→ VALUE
といった感じです。
(VALUE
の実態はruby.h
でtypedef unsigned long VALUE;
と定義されています。)
数値の変換
FIX2INT
FIX2INT
はRubyでいうところの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