カテゴリー
Wiki内検索
*
最近更新したページ
最新コメント
win32/guitest by stunning seo guys
FrontPage by stunning seo guys
SWIG by awesome things!
Win32/Console by stunning seo guys
FrontPage by awesome things!
Win32SDK_ICM by stunning seo guys
Win32SDK_MM by check it out
Win32SDK_process by stunning seo guys
VisualuRuby by stunning seo guys

Rubyの拡張ライブラリの作り方・付録


Appendix A. Rubyのソースコードの分類


Rubyのソースはいくつかに分類することが出来ます.このうちクラスライブラリの部分は基本的に拡張ライブラリと同じ作り方になっています.これらのソースは今までの説明でほとんど理解できると思います.

Ruby言語のコア


class.c
error.c
eval.c
gc.c
object.c
parse.y
variable.c

ユーティリティ関数


dln.c
regex.c
st.c
util.c

Rubyコマンドの実装


dmyext.c
inits.c
main.c
ruby.c
version.c

クラスライブラリ


array.c
bignum.c
compar.c
dir.c
enum.c
file.c
hash.c
io.c
marshal.c
math.c
numeric.c
pack.c
prec.c
process.c
random.c
range.c
re.c
signal.c
sprintf.c
string.c
struct.c
time.c

Appendix B. 拡張用関数リファレンス


C言語からRubyの機能を利用するAPIは以下の通りである.


VALUE
Rubyオブジェクトを表現する型.必要に応じてキャストして用いる.組み込み型を表現するCの型はruby.hに記述してあるRで始まる構造体である.VALUE型をこれらにキャストするためにRで始まる構造体名を全て大文字にした名前のマクロが用意されている.

変数・定数


Qnil
定数: nilオブジェクト

Qtrue
定数: trueオブジェクト(真のデフォルト値)

Qfalse
定数: falseオブジェクト

Cデータのカプセル化


Data_Wrap_Struct(VALUE klass, void (*mark)(), void (*free)(), void *sval)
Cの任意のポインタをカプセル化したRubyオブジェクトを返す.このポインタがRubyからアクセスされなくなった時,freeで指定した関数が呼ばれる.また,このポインタの指すデータが他のRubyオブジェクトを指している場合,markに指定する関数でマークする必要がある.

Data_Make_Struct(klass, type, mark, free, sval)
type型のメモリをmallocし,変数svalに代入した後,それをカプセル化したデータを返すマクロ.

Data_Get_Struct(data, type, sval)
dataからtype型のポインタを取り出し変数svalに代入するマクロ.

型チェック


TYPE(value)
FIXNUM_P(value)
NIL_P(value)
void Check_Type(VALUE value, int type)
void Check_SafeStr(VALUE value)

型変換


FIX2INT(value)
INT2FIX(i)
NUM2INT(value)
INT2NUM(i)
NUM2DBL(value)
rb_float_new(f)
StringValue(value)
StringValuePtr(value)
StringValueCStr(value)
rb_str_new2(s)

クラス/モジュール定義


VALUE rb_define_class(const char *name, VALUE super)
superのサブクラスとして新しいRubyクラスを定義する.

VALUE rb_define_class_under(VALUE module, const char *name, VALUE super)
superのサブクラスとして新しいRubyクラスを定義し,moduleの定数として定義する.

VALUE rb_define_module(const char *name)
新しいRubyモジュールを定義する.

VALUE rb_define_module_under(VALUE module, const char *name)
新しいRubyモジュールを定義し,moduleの定数として定義する.

void rb_include_module(VALUE klass, VALUE module)
モジュールをインクルードする.classがすでにmoduleをインクルードしている時には何もしない(多重インクルードの禁止).

void rb_extend_object(VALUE object, VALUE module)
オブジェクトをモジュール(で定義されているメソッド)で拡張する.

大域変数定義


void rb_define_variable(const char *name, VALUE *var)
RubyとCとで共有するグローバル変数を定義する.変数名が`$'で始まらない時には自動的に追加される.nameとしてRubyの識別子として許されない文字(例えば` ')を含む場合にはRubyプログラムからは見えなくなる.

void rb_define_readonly_variable(const char *name, VALUE *var)
RubyとCとで共有するread onlyのグローバル変数を定義する.read onlyであること以外はrb_define_variable()と同じ.

void rb_define_virtual_variable(const char *name, VALUE (*getter)(), void (*setter)())
関数によって実現されるRuby変数を定義する.変数が参照された時にはgetterが,変数に値がセットされた時にはsetterが呼ばれる.

void rb_define_hooked_variable(const char *name, VALUE *var, VALUE (*getter)(), void (*setter)())
関数によってhookのつけられたグローバル変数を定義する.変数が参照された時にはgetterが,関数に値がセットされた時にはsetterが呼ばれる.getterやsetterに0を指定した時にはhookを指定しないのと同じ事になる.

void rb_global_variable(VALUE *var)
GCのため,Rubyプログラムからはアクセスされないが, Rubyオブジェクトを含む大域変数をマークする.

定数


void rb_define_const(VALUE klass, const char *name, VALUE val)
定数を定義する.

void rb_define_global_const(const char *name, VALUE val)
大域定数を定義する.
rb_define_const(rb_cObject, name, val)
と同じ意味.

メソッド定義


rb_define_method(VALUE klass, const char *name, VALUE (*func)(), int argc)
メソッドを定義する.argcはselfを除く引数の数.argcが-1の時, 関数には引数の数(selfを含まない)を第1引数, 引数の配列を第2引数とする形式で与えられる(第3引数はself).argcが-2の時, 第1引数がself, 第2引数がargs(argsは引数を含むRubyの配列)という形式で与えられる.

rb_define_private_method(VALUE klass, const char *name, VALUE (*func)(), int argc)
privateメソッドを定義する.引数はrb_define_method()と同じ.

rb_define_singleton_method(VALUE klass, const char *name, VALUE (*func)(), int argc)
特異メソッドを定義する.引数はrb_define_method()と同じ.

rb_scan_args(int argc, VALUE *argv, const char *fmt, ...)
argc, argv形式で与えられた引数を分解する.fmtは必須引数の数, 付加引数の数, 残りの引数があるかを指定する文字列で, "数字数字*"という形式である. 2 番目の数字と"*"はそれぞれ省略可能である.必須引数が一つもない場合は0を指定する.第3引数以降は変数へのポインタで, 該当する要素がその変数に格納される.付加引数に対応する引数が与えられていない場合は変数にQnilが代入される.

Rubyメソッド呼び出し


VALUE rb_funcall(VALUE recv, ID mid, int narg, ...)
メソッド呼び出し.文字列からmidを得るためにはrb_intern()を使う.

VALUE rb_funcall2(VALUE recv, ID mid, int argc, VALUE *argv)
メソッド呼び出し.引数をargc, argv形式で渡す.

VALUE rb_eval_string(const char *str)
文字列をRubyスクリプトとしてコンパイル・実行する.

ID rb_intern(const char *name)
文字列に対応するIDを返す.

char *rb_id2name(ID id)
IDに対応する文字列を返す(デバッグ用).

char *rb_class2name(VALUE klass)
クラスの名前を返す(デバッグ用).クラスが名前を持たない時には, 祖先を遡って名前を持つクラスの名前を返す.

int rb_respond_to(VALUE obj, ID id)
objがidで示されるメソッドを持つかどうかを返す。

インスタンス変数


VALUE rb_iv_get(VALUE obj, const char *name)
objのインスタンス変数の値を得る.`@'で始まらないインスタンス変数は Rubyプログラムからアクセスできない「隠れた」インスタンス変数になる.定数は大文字の名前を持つクラス(またはモジュール)のインスタンス変数として実装されている.

VALUE rb_iv_set(VALUE obj, const char *name, VALUE val)
objのインスタンス変数をvalにセットする.

制御構造


VALUE rb_iterate(VALUE (*func1)(), VALUE arg1, VALUE (*func2)(), VALUE arg2)
func2をブロックとして設定し, func1をイテレータとして呼ぶ. func1には arg1が引数として渡され, func2には第1引数にイテレータから与えられた値, 第2引数にarg2が渡される.

VALUE rb_yield(VALUE val)
valを値としてイテレータブロックを呼び出す.

VALUE rb_rescue(VALUE (*func1)(), VALUE arg1, VALUE (*func2)(), VALUE arg2)
関数func1をarg1を引数に呼び出す.func1の実行中に例外が発生した時には func2をarg2を引数として呼ぶ.戻り値は例外が発生しなかった時はfunc1の戻り値, 例外が発生した時にはfunc2の戻
り値である.

VALUE rb_ensure(VALUE (*func1)(), VALUE arg1, void (*func2)(), VALUE arg2)
関数func1をarg1を引数として実行し, 実行終了後(たとえ例外が発生しても) func2をarg2を引数として実行する.戻り値はfunc1の戻り値である(例外が発生した時は戻らない).

例外・エラー


void rb_warning(const char *fmt, ...)
rb_verbose時に標準エラー出力に警告情報を表示する.引数はprintf()と同じ.

void rb_raise(rb_eRuntimeError, const char *fmt, ...)
RuntimeError例外を発生させる.引数はprintf()と同じ.

void rb_raise(VALUE exception, const char *fmt, ...)
exceptionで指定した例外を発生させる.fmt以下の引数はprintf()と同じ.

void rb_fatal(const char *fmt, ...)
致命的例外を発生させる.通常の例外処理は行なわれず, インタープリタが終了する(ただしensureで指定されたコードは終了前に実行される).

void rb_bug(const char *fmt, ...)
インタープリタなどプログラムのバグでしか発生するはずのない状況の時呼ぶ.インタープリタはコアダンプし直ちに終了する.例外処理は一切行なわれない.

Rubyの初期化・実行


Rubyをアプリケーションに埋め込む場合には以下のインタフェース
を使う.通常の拡張ライブラリには必要ない.

void ruby_init()
Rubyインタプリタの初期化を行なう.

void ruby_options(int argc, char **argv)
Rubyインタプリタのコマンドライン引数の処理を行なう.

void ruby_run()
Rubyインタプリタを実行する.

void ruby_script(char *name)
Rubyのスクリプト名($0)を設定する.


Appendix C. extconf.rbで使える関数たち


extconf.rbの中では利用可能なコンパイル条件チェックの関数は以
下の通りである.

have_macro(macro, headers)
ヘッダファイルheaderをインクルードしてマクロmacroが定義されているかどうかチェックする.マクロが定義されている時trueを返す.

have_library(lib, func)
関数funcを定義しているライブラリlibの存在をチェックする.ライブラリが存在する時,trueを返す.

find_library(lib, func, path...)
関数funcを定義しているライブラリlibの存在を -Lpath を追加しながらチェックする.ライブラリが見付かった時,trueを返す.

have_func(func, header)
ヘッダファイルheaderをインクルードして関数funcの存在をチェックする.funcが標準ではリンクされないライブラリ内のものである時には先にhave_libraryでそのライブラリをチェックしておく事.関数が存在する時trueを返す.

have_var(var, header)
ヘッダファイルheaderをインクルードして変数varの存在をチェックする.varが標準ではリンクされないライブラリ内のものである時には先にhave_libraryでそのライブラリをチェックしておく事.変数が存在する時trueを返す.

have_header(header)
ヘッダファイルの存在をチェックする.ヘッダファイルが存在する時trueを返す.

find_header(header, path...)
ヘッダファイルheaderの存在を -Ipath を追加しながらチェックする.ヘッダファイルが見付かった時,trueを返す.

have_struct_member(type, member, header)
ヘッダファイルheaderをインクルードして型typeにメンバmemberが存在するかをチェックする.typeが定義されていて,memberを持つする時trueを返す.

have_type(type, header, opt)
ヘッダファイルheaderをインクルードして型typeが存在するかをチェックする.typeが定義されている時trueを返す.

check_sizeof(type, header)
ヘッダファイルheaderをインクルードして型typeのchar単位サイズを調べる.typeが定義されている時そのサイズを返す.定義されていないときはnilを返す.

create_makefile(target)
拡張ライブラリ用のMakefileを生成する.この関数を呼ばなければそのライブラリはコンパイルされない.targetはモジュール名を表す.

find_executable(command, path)
コマンドcommandをFile::PATH_SEPARATORで区切られたパス名のリストpathから探す.pathがnilまたは省略された場合は,環境変数PATHの値を使用する.実行可能なコマンドが見つかった場合はパスを含むファイル名,見つからなかった場合はnilを返す.

with_config(withval[, default=nil])
コマンドライン上の--with-<withval>で指定されたオプション値を得る.

enable_config(config, *defaults)
disable_config(config, *defaults)
コマンドライン上の--enable-<config>または--disable-<config>で指定された真偽値を得る.--enable-<config>が指定されていた場合はtrue,--disable-<config>が指定されていた場合はfalseを返す.どちらも指定されていない場合は,ブロックつきで呼び出されている場合は*defaultsをyieldした結果,ブロックなしなら*defaultsを返す.

dir_config(target[, default_dir])
dir_config(target[, default_include, default_lib])
コマンドライン上の--with-<target>-dir, --with-<target>-include,--with-<target>-libのいずれかで指定されるディレクトリを$CFLAGS や $LDFLAGS に追加する.--with-<target>-dir=/pathは--with-<target>-include=/path/include --with-<target>-lib=/path/libと等価である.追加された include ディレクトリと lib ディレクトリの配列を返す. ([include_dir, lib_dir])

pkg_config(pkg)
pkg-configコマンドからパッケージpkgの情報を得る. pkg-configの実際のコマンド名は,--with-pkg-configコマンドラインオプションで指定可能.
2006年12月09日(土) 17:09:13 Modified by aqualung




スマートフォン版で見る