まつもと ゆきひろです

In message "[ruby-dev:3373] [BUG] attr"
    on 98/07/23, WATANABE Tetsuya <tetsu / jpn.hp.com> writes:

|わたなべてつやです。
|
|1.1c0 で Linux 上で起きます。HP-UX だとエラーになります。
|
|次のような間違った記述なのですが、core してしまいます。

バグですね.パッチを付けておきます.

余談ですが,

|------------------------------
|class Vgp
|  @vg_opencount = 0
|  @num_lvols = 0
|  attr @vg_opencount
|  attr @num_lvols
|end
|
|j = Vgp.new
|
|exit
|------------------------------

というような間違いの直接的な原因は理解できないでもないですが
(undefとかaliasとか識別子をそのまま受け付けるのもあるから),
クラスレベルでインスタンス変数を使ってしまうっていうのはあり
がちな間違いだと思います.

--[強調]
Rubyではクラス定義のレベルとメソッド定義のレベルでは文脈が全
く独立です.インスタンス変数も別物です.
--

よく見掛ける間違いですので気を付けて下さい.なれればどうとい
うことは無いんですけどね.

--- eval.c	1998/07/22 03:00:38	1.1.1.2.2.74
+++ eval.c	1998/07/23 04:14:41
@@ -328,3 +328,3 @@
     char *buf;
-    ID attr, attreq, attriv;
+    ID attr, attriv;
     int noex;
@@ -346,6 +346,6 @@
     name = rb_id2name(id);
-    attr = rb_intern(name);
+    if (!name) {
+	ArgError("argument needs to be symbol or string");
+    }
     buf = ALLOCA_N(char,strlen(name)+2);
-    sprintf(buf, "%s=", name);
-    attreq = rb_intern(buf);
     sprintf(buf, "@%s", name);
@@ -353,6 +353,8 @@
     if (read) {
-	rb_add_method(klass, attr, NEW_IVAR(attriv), noex);
+	rb_add_method(klass, id, NEW_IVAR(attriv), noex);
     }
+    sprintf(buf, "%s=", name);
+    id = rb_intern(buf);
     if (write) {
-	rb_add_method(klass, attreq, NEW_ATTRSET(attriv), noex);
+	rb_add_method(klass, id, NEW_ATTRSET(attriv), noex);
     }