連続投稿申し訳ありません。川口です。
自己解決しました。
rb_cv_get() の第一引数に渡す値が間違っていました。
インスタンスを渡すのではなく、クラスを渡すのですね。
とうことで、Moge.c の moge_func() を以下のようにして動作することを確認しました。
VALUE moge_func(VALUE self)
{
VALUE klass = CLASS_OF(self);
VALUE val = rb_cv_get(klass, "@@val");
if (val == Qnil) {
printf("@@val : nil\n");
}
else {
printf("@@val : %d\n", NUM2INT(val));
}
return Qnil;
}
お騒がせしました。
>川口です。
>
>
>>Ruby の C の拡張ライブラリからクラス変数を参照したいのですが、
>>rb_iv_get() を使うと nil を返してきます。
>>クラス変数を参照するにはほかの関数があるのでしょうか?
>>宜しくお願いします。
>(略)
>
>調べたところ、クラス変数を参照するには rb_cv_get() を使うということがわかりました。
>しかし、以下のようにソースを修正したところ、
>
> VALUE val = rb_iv_get(self, "@@val");
> ↓
> VALUE val = rb_cv_get(self, "@@val");
>
>クラス変数が初期化されていない、というエラーが出力されました。
>moge.rb:12:in `func': uninitialized class variable @@val in #<Class:0x806c788> (
>NameError)
>
>まだ何かおかしいところがありますでしょうか?