[ruby-list:50187] Re: クラス変数の定義について
From:
YOKOYAMA Takehiro <tac@...>
Date:
2015-07-01 06:47:23 UTC
List:
ruby-list #50187
>すいません、クラス変数についても定数についてもよくわからないのですが、
>具体的にはどういうコードでどういう例外が発生するのでしょうか。
たとえば以下のプログラムを実行すると、
(1) rb_define_class_variable() で例外が発生し、x_rb_rescue() に制御が移って
x_rb_rescue: x_rb_define_class_variable: wrong class variable name tt_cvar
と表示されます。
なお、rb_cv_set() でも動作は同じです。rb_cvar_set() ならば例外になりません。
(2) rb_define_const() で
<main>: warning: rb_define_const: invalid name `tt_const' for constant
という警告が出ます。ただし、定数の値は正しく設定されるので、
[A] i_val = 15
と表示されます。
なお、rb_const_set() ならば警告は出ません。
#include <ruby.h>
VALUE x_rb_define_class_variable(VALUE args)
{
VALUE klass = rb_define_class("FooClass", rb_cObject);
rb_define_class_variable(klass, "tt_cvar", INT2NUM(14));
/* rb_cv_set(klass, "tt_cvar", INT2NUM(14)); */
/* rb_cvar_set(klass, rb_intern("tt_cvar"), INT2NUM(14)); */
return Qnil;
}
VALUE x_rb_rescue(VALUE args, VALUE excep)
{
char * func_name = StringValuePtr(args);
VALUE val_message = rb_funcall(excep, rb_intern("message"), 0);
char * message = StringValuePtr(val_message);
printf("x_rb_rescue: %s: %s\n", func_name, message);
return Qnil;
}
int main(int argc, char * argv[])
{
VALUE klass;
VALUE val;
int i_val;
ruby_init();
val = rb_rescue(x_rb_define_class_variable, Qnil,
x_rb_rescue, rb_str_new_cstr("x_rb_define_class_variable"));
klass = rb_define_class("BaaClass", rb_cObject);
rb_define_const(klass, "tt_const", INT2NUM(15));
/* rb_const_set(klass, rb_intern("tt_const"), INT2NUM(15)); */
val = rb_const_get(klass, rb_intern("tt_const"));
i_val = NUM2INT(val);
printf("[A] i_val = %d\n", i_val);
ruby_finalize();
return 0;
}
--
tac@amris.co.jp
横山岳浩