From: sheepman Date: 2008-06-21T09:14:24+09:00 Subject: [ruby-dev:35190] Re: [BUG] class variable こんにちは sheepman です。 これは特異メソッドではなくて、クラス変数のスコープの問題だと思います。 言語仕様にとりあえず以下のように書き加えておきました。 http://doc.loveruby.net/refm/api/view/spec/variables#class_var_scope 例えば、以下のようなスクリプトでも 1 を表示します。1.8,1.9両方で。 class A end class B @@v = 1 def A.hoge @@v end end p A.hoge #=> 1 On Wed, 18 Jun 2008 01:17:17 +0900 Hidetoshi NAGAI wrote: > うゎ,ごめんなさい.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) > 九州工業大学 大学院情報工学研究院 知能情報工学研究系 > -- sheepman / TAMURA Takashi sheepman@sheepman.sakura.ne.jp http://sheepman.parfait.ne.jp/