まつもと ゆきひろです

In message "[ruby-dev:228] How to handle Struct"
    on 97/08/25, Eiji-usagi-MATSUmoto <ematsu / pfu.co.jp> 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; i<RARRAY(member)->len; 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をちょっと見たんですが、分からなくて。。。

そりゃあそうでしょう.
                                まつもと ゆきひろ /:|)