まつもと ゆきひろです
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をちょっと見たんですが、分からなくて。。。
そりゃあそうでしょう.
まつもと ゆきひろ /:|)