tana_ash's diary

プログラミングや電子工作など。やってみたこと、わかったことをまとめておく場所。

mrubyのメモとか。

mrubyについていろいろ調べながらプログラムを書いてます。
その中で調べたことについて書いておきます。
主に、C言語からmrubyにメソッドを追加したり呼び出したりすることについてです。
http://avr.paslog.jp/article/2492088.htmlhttp://akasata.hatenablog.com/entry/2012/05/30/202432 を参考にしています。

// メソッドを定義します。
// 二つ目の引数では定義する先のモジュールを指定するようですが、
// ここはKernelにしたので関数のように使えます。
// mrbはmrb_stateで、多くのの関数で引数になっています。
mrb_state *mrb = mrb_open();
// のようにして生成します。
mrb_define_method(mrb, mrb->kernel_module, "メソッド名", &中身の関数, 引数の数);

// 中身の関数はこうなっています。
mrb_value hoge(mrb_state *s, mrb_value self) {
  mrb_int a, b;
  // この関数で渡された引数を取得できます。
  // "ii"のところで、引数がどんな型なのかを指定するようです。
  // "i"はintのことで、それを二つ並べるとintが2つになります。
  // オブジェクトなら"o"を使います。
  mrb_get_args(s, "ii", &a, &b);
  // これはnilを生成して返します。
  return mrb_nil_value();
}

// オブジェクト場合はこうです。(これはオブジェクトを2つ引数に取る場合)
mrb_value a;
mrb_value b;
mrb_get_args(s, "oo", &a, &b);

// オブジェクトのメソッドを呼び出すにはこうします。
// 今回は、引数の数が0の場合です。
// sはmrb_stateです。
result = mrb_fixnum(mrb_funcall(s, オブジェクト, "メソッド名", 引数の数));
// mrb_funcallでメソッドを呼び出しますが、その結果はRubyの値(mrb_value)なので、
// intが欲しい場合はmrb_fixnumを使ってintを取り出します。

// クラスをインスタンス化してオブジェクトを生成する方法です。
// オブジェクトを表す値が返ってきます。
// sはmrb_stateです。
// 二つ目の引数の2は引数の数、三つ目のarrは引数の配列で、Rubyの値を表すmrb_valueの配列です。
// mrb_valueの配列なのでintはそのまま入りません。
// なので、mrb_fixnum_valueでint型の値をmrb_valueに変換します。
// mrb_class_get(s, "クラス名")は、クラスを取得しています。
mrb_value arr[2];
arr[0] = mrb_fixnum_value(x);
arr[1] = mrb_fixnum_value(y);
mrb_class_new_instance(s, 2, arr, mrb_class_get(s, "クラス名"));

ちなみに、SDLとmrubyを組み合わせてゲームでも作れたらと思っていろいろやってます。