From: YOKOYAMA Takehiro Date: 2015-07-01T15:47:23+09:00 Subject: [ruby-list:50187] Re: クラス変数の定義について >すいません、クラス変数についても定数についてもよくわからないのですが、 >具体的にはどういうコードでどういう例外が発生するのでしょうか。 たとえば以下のプログラムを実行すると、 (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() で
: warning: rb_define_const: invalid name `tt_const' for constant という警告が出ます。ただし、定数の値は正しく設定されるので、 [A] i_val = 15 と表示されます。 なお、rb_const_set() ならば警告は出ません。 #include 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 横山岳浩