From: Hidetoshi NAGAI Date: 2008-06-18T01:17:17+09:00 Subject: [ruby-dev:35149] Re: [BUG] class variable 永井@知能.九工大です. From: SASADA Koichi Subject: [ruby-dev:35147] Re: [BUG] class variable Date: Tue, 17 Jun 2008 23:41:07 +0900 Message-ID: <4857CD3E.70004@atdot.net> >  すみませんすみません.[ruby-dev:34527] は別の話で,しかもすでに > パッチはあたっていました orz > >  永井さんの指摘は,また別の指摘でしょうか.つまり,1.8 以前も間違っ > ている,ということ? うゎ,ごめんなさい.1.8 以前ではできていたと勘違いしてました. 勝手に勘違いしていた私が悪いだけかもしれませんが, [ruby-dev:35133] で述べていたのは,マニュアルに書かれた 「Ruby におけるクラスメソッドとはクラスの特異メソッドのことです」 という定義から期待されるものと挙動が違うということです. この定義に基づくなら, ------------------------------------- class A @iVAR=0 @@VAR = 1 def self.hoge; p @iVAR; p @@VAR; end def A.fuga; p @iVAR; p @@VAR; end end class << A def foo; p @iVAR; p @@VAR; end end def A.bar; p @iVAR; p @@VAR; end ------------------------------------- の A.hoge, A.fuga, A.foo, A.bar は同等のクラスメソッドであることを 期待してしまいますが,A.hoge, A.fuga は 0, 1 を返すものの, A.foo は ------------------------------------- irb(main):013:0> A.foo 0 (irb):8: warning: class variable access from toplevel NameError: uninitialized class variable @@VAR in Object from (irb):8:in `foo' from (irb):13 from /usr/local/bin/irb19:12:in `
' ------------------------------------- ですし,A.bar は ------------------------------------- irb(main):014:0> A.bar 0 NameError: uninitialized class variable @@VAR in Object from (irb):10:in `bar' from (irb):14 from /usr/local/bin/irb19:12:in `
' ------------------------------------- となります (警告表示分,微妙に動作が違うのも気になります). というわけで,クラスのインスタンス変数へのアクセスは同じですが, クラス変数へのアクセスは挙動が異なるということになります. # この点,オブジェクトの特異メソッドでも同じだったんですね.(^_^; # 特異メソッドとして定義するとクラス変数へのアクセスはできない. マニュアルの定義を改めて, 「特異クラスが介在した場合, 特異メソッドの定義はその特異クラスへの定義となるため, 特異メソッドを定義しようとしているクラスのクラス変数へは アクセスできません. そのため,クラスの特異メソッドとクラスメソッドとは 見掛けは同じに見えますが挙動は異なります」 と定義して,マニュアルにおけるコード例でも違いを明示するのであれば, それはそれでいいのかもしれません. # ただその場合でも,A.fuga と A.bar との違いは # やや分かりづらいように感じて,あまりすっきりはしませんが... 発端は私の勝手な思い込みですので, 「仕様を変更すべき」などとは主張しませんが, 私のような勘違いを防ぐためにも マニュアルの記述は修正すべきかと思います. -- 永井 秀利 (nagai@ai.kyutech.ac.jp) 九州工業大学 大学院情報工学研究院 知能情報工学研究系