Skip to content

Internal API

tsahara edited this page Dec 17, 2014 · 8 revisions
  • mrb_check_convert_type : mrb_value mrb_check_convert_type(mrb_state *mrb, mrb_value val, enum mrb_vtype type, const char *tname, const char *method);
    • mrb_convert_type とほぼ同じだが例外を上げる代わりに nil を返す。
  • mrb_class_get : struct RClass *mrb_class_get(mrb_state *mrb, const char *name)
    • name という名前のクラスの struct RClass * を得る。
  • mrb_convert_type : mrb_value mrb_convert_type(mrb_state *mrb, mrb_value val, enum mrb_vtype type, const char *tname, const char *method);
    • 値 val を type で表される型に変換する。変換できない場合は TypeError 例外を上げる。 tname は変換先の型(type)のC文字列表現で例外メッセージの作成に使われる。 method は変換に使うメソッド名を指定する(つまり適切なメソッドを選んでよろしく変換してくれるわけではない)。
  • mrb_intern_cstr : mrb_sym mrb_intern_cstr(mrb_state *mrb, const char *str)
    • 文字列 str に対応するシンボルを得る。
  • mrb_method_search : struct RProc *mrb_method_search(mrb_state *mrb, struct RClass *c, mrb_sym mid)
    • シンボル mid で表される、クラス c のメソッドを得る。見つからなければ NameError 例外を上げる。
  • mrb_method_search_vm : struct RProc *mrb_method_search(mrb_state *mrb, struct RClass **cp, mrb_sym mid)
    • シンボル mid で表される、クラス *cp のメソッドを得る。見つかった場合、そのメソッドを実装しているクラスを *cp に入れて返す。 メソッドが元の *cp の親クラスなどの別のクラスで定義されている場合に *cp の値が書き変わる。

String

文字列の結合

  • mrb_str_buf_append : mrb_value mrb_str_buf_append(mrb_state *mrb, mrb_value str, mrb_value str2);
    • mrb_str_buf_new で作成した文字列 str の末尾に文字列 str2 を追加する。
  • mrb_str_buf_cat : mrb_value mrb_str_buf_cat(mrb_state *mrb, mrb_value str, const char *ptr, size_t len);
    • 代わりに mrb_str_cat を使うべき。len == 0 や (mrb_int)len < 0 の振舞が少し異なるのみ。
  • mrb_str_cat : mrb_value mrb_str_cat(mrb_state *mrb, mrb_value str, const char *ptr, size_t len);
    • 文字列 str の後に ptr からの len バイトを追加する。追加する文字列の長さがわかっているときや NUL 文字を追加する時はこれ。
  • mrb_str_cat_cstr : mrb_value mrb_str_cat_cstr(mrb_state *mrb, mrb_value str, const char *ptr);
    • 文字列 str の後に C 文字列 ptr を追加する。
  • mrb_str_cat_lit : mrb_value mrb_str_cat_lit(mrb_state *mrb, mrb_value str, const char *ptr);
    • 文字列 str の後に C 文字列リテラル ptr を追加する。mrb_str_cat_cstr とほぼ一緒だが、ptr がリテラルの場合はこちらを使った方が効率が良い。
  • mrb_str_concat : void mrb_str_concat(mrb_state *mrb, mrb_value self, mrb_value other);
    • self の後に other を追加する。mrb_value 二つを結合する場合はこれ。

その他

  • mrb_str_buf_new : mrb_value mrb_str_buf_new(mrb_state *mrb, mrb_int capa);
    • capa+1 以上のサイズの内部バッファ(RSTRING_PTR)を持つ String を生成する。初期値は空文字列である。 現在(2013/10/3)の実装では、返ってきた String の RSTRING_PTR を参照して直接書き換え、その後 mrb_str_resize で 長さを設定すればデータ構造に矛盾を来すことなく操作できる。しかし安全のためには mrb_str_buf_cat や mrb_str_buf_append 等の API を利用するべきだろう。
  • mrb_str_new : mrb_value mrb_str_new(mrb_state *mrb, const char *p, size_t len);
    • ポインタ p と長さ len で表される C 言語文字列から Ruby の String を作る。現在の実装では作成された String は shared されていないが、将来にわたってその特性が維持されると考えるのは危険かもしれない。
  • mrb_str_new_cstr : mrb_value mrb_str_new_cstr(mrb_state *mrb, const char *p);
    • C言語文字列から Ruby 文字列を作る。内部的に strlen() を呼ぶため、長さがわかっている場合は mrb_str_new の方が効率が良い。 NULL を渡すと空の String が作られる。
  • mrb_str_new_static : mrb_value mrb_str_new_static(mrb_state *mrb, const char *p, size_t len);
    • mrb_str_new とほぼ同じだが、mrb_str_new と異なり p で示されるC言語文字列のコピーをつくらず、直接参照する。 特殊な String となるため基本的に使わない方が無難。Symbol の実装で利用されている。
  • mrb_str_strlen : mrb_int mrb_str_strlen(mrb_state *mrb, struct RString *s);
    • s の長さを返す。ただし、同時にバイト列をなめ、NUL 文字が含まれていれば例外を上げる。 なお、RSTRING_PTR が NULL の場合は単に 0 を返す。
Clone this wiki locally