2019年3月29日金曜日

Ruby の NativeExtensions で boolean を引数に取る方法

概要

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 に変換している点です
RTESTQfalse 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 件のコメント:

コメントを投稿