From: matz@... (Yukihiro Matsumoto) Date: 1997-08-25T12:02:05+09:00 Subject: [ruby-dev:229] Re: How to handle Struct まつもと ゆきひろです In message "[ruby-dev:228] How to handle Struct" on 97/08/25, Eiji-usagi-MATSUmoto writes: | |うさぎです。 | |カミさんと子どもが実家に帰ったので、ruby三昧な週末を |送ってました(笑) うさぎさんって既婚だったんだ….^^;;; |拡張モジュールに関する質問です。 | |Struct(のサブクラス)のインスタンスを、拡張モジュールで |定義したメソッドに渡してやりたいのですが、C側で受け取っ |た後、どのようにしてメンバを取り出してやればいいのでしょ |う? しまった.C側から参照するAPIを用意していなかった ^^;;; こんな感じでどうでしょう. VALUE struct_member(VALUE obj, ID mem) という感じで,第1引数はstruct,第2引数はメンバ名を示すIDです. IDはrb_intern()を使って得て下さい. --- struct.c~ Fri Jun 20 01:24:12 1997 +++ struct.c Mon Aug 25 11:43:45 1997 @@ -44,5 +44,6 @@ -static VALUE -struct_ref(obj) +VALUE +struct_getmember(obj, id) struct RStruct *obj; + ID id; { @@ -54,5 +55,5 @@ if (NIL_P(member)) { - Fatal("non-initialized struct"); + Bug("non-initialized struct"); } - slot = INT2FIX(rb_frame_last_func()); + slot = INT2FIX(id); for (i=0; ilen; i++) { @@ -62,4 +63,11 @@ } - NameError("not struct member"); + NameError("%s is not struct member", rb_id2name(id)); /* not reached */ +} + +static VALUE +struct_ref(obj) + VALUE obj; +{ + return struct_getmember(obj, rb_frame_last_func()); } |struct.cをちょっと見たんですが、分からなくて。。。 そりゃあそうでしょう. まつもと ゆきひろ /:|)