2019年3月30日土曜日

NativeExtensions で method chain 的な使い方をする方法

概要

NativeExtensions で作ったライブラリでも Ruby 側で使うときは method chain 的にドットを使ってメンバなどを参照したいです
そんな場合に使えるサンプルを紹介します

環境

  • macOS 10.14.3
  • Ruby 2.5.1p57

サンプルコード

ポイントは wrap_chain 関数が self を return している点です
こうすることで別のメソッドをドットで繋げてコールすることができます

static VALUE wrap_chain(VALUE self, VALUE _name) {
  MyStruct *s;
  Data_Get_Struct(self, MyStruct, s);
  char *name = StringValuePtr(_name);
  s->name1 = name;
  return self;
}

static VALUE wrap_name(VALUE self) {
  MyStruct *s;
  Data_Get_Struct(self, MyStruct, s);
  return rb_str_new2(s->name1);
}

ちなみに MyStruct は以下のような感じです

typedef struct {
  char *name1;
} MyStruct;

使う

こんな感じで chanin.name という感じで参照できます
chain が Qnil を返すような関数にすると再度 cli から参照する必要があります

cli = FirstExt.new
puts cli.chain("hawksnowlog").name

0 件のコメント:

コメントを投稿