[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
横山岳浩

In This Thread