概要
C 側で Ruby の Boolean を扱う方法です
環境
- macOS 10.14.3
- Ruby 2.5.1p57
サンプル
C 側のコードは以下の通りです
static VALUE wrap_bool_test(VALUE self, VALUE _bool) {
int bool = RTEST(_bool);
if (bool == 1) {
return Qtrue;
} else {
return Qfalse;
}
}
ポイントは RTEST
で C 側で扱える int に変換している点です
RTEST は Qfalse
or Qnil
が Ruby から渡ってきた場合に真 (1) を返すマクロです
テストコード
Ruby 側でコールする方法です
RSpec.describe FirstExt do
it "create a instance" do
cli = FirstExt.new
puts cli.bool_test(true)
puts cli.bool_test(false)
puts cli.bool_test(1)
puts cli.bool_test('a')
end
end
結果は以下の通りです
true
false
true
true
結果を見るとわかりますが完全に Ruby の Bool と C 側の変換が完全互換でできているわけでありません
false
を渡しているときだけ false
が返ってきていますが true
以外を渡しても true
が返ってきてしまっています
最後に
NativeExtensions で Boolean を扱う方法を紹介しました
おそらくこれが一番簡単な方法だと思います
0 件のコメント:
コメントを投稿