Bug #5689

class variables inside of instance methods inside of "class_eval"

Added by Shyouhei Urabe almost 4 years ago. Updated over 3 years ago.

[ruby-dev:44906]
Status:Rejected
Priority:Normal
Assignee:-
ruby -v:- Backport:

Description

インスタンスメソッドの中から他のクラスのクラス変数が見えるというのはいかにもまずそうに思うのですが、以下の挙動は意図的ですか。

zsh % ~/target/trunk/bin/ruby -ve'
class Klass
@@cvar = "Klass"
end

Klass.module_eval do
def cvar
@@cvar
end
end

@@cvar = "main"
puts Klass.new.cvar'

ruby 2.0.0dev (2011-11-30 trunk 33904) [x86_64-linux]
-e:12: warning: class variable access from toplevel
-e:8: warning: class variable access from toplevel
main

History

#1 Updated by Shugo Maeda almost 4 years ago

Shyouhei Urabe wrote:

インスタンスメソッドの中から他のクラスのクラス変数が見えるというのはいかにもまずそうに思うのですが、以下の挙動は意図的ですか。

zsh % ~/target/trunk/bin/ruby -ve'
class Klass
@@cvar = "Klass"
end

Klass.module_eval do
def cvar
@@cvar
end
end

@@cvar = "main"
puts Klass.new.cvar'

module_evalは定数同様にクラス変数の探索にも影響しないので、意図的では
あるんじゃないでしょうか。
定数探索の動作を1.8と同じに戻した時の議論で、クラス変数をどうするかも
議論した上で、合わせて1.8の動作に戻したように記憶しています。

ただ、今の動作が望ましいかどうかは議論の余地があると思います。

#2 Updated by Yukihiro Matsumoto almost 4 years ago

  • ruby -v changed from ruby 2.0.0dev (2011-11-30 trunk 33904) [x86_64-linux] to -

まつもと ゆきひろです

In message "Re: [ruby-trunk - Bug #5689] class variables inside of instance methods inside of "class_eval""
on Wed, 30 Nov 2011 13:14:05 +0900, Shugo Maeda redmine@ruby-lang.org writes:

|module_evalは定数同様にクラス変数の探索にも影響しないので、意図的では
|あるんじゃないでしょうか。
|定数探索の動作を1.8と同じに戻した時の議論で、クラス変数をどうするかも
|議論した上で、合わせて1.8の動作に戻したように記憶しています。

意図的です。ので、これは少なくともバグではありません。

|ただ、今の動作が望ましいかどうかは議論の余地があると思います。

そうですね。「module_evalは定数(やクラス変数)の探索先を変えて
しまったほうが良い」という考えは当然ありえると思いますし、実
際にそう期待している人もそれなりにいるようです。

そのように帰るべきだと考える場合にはfeature proposalとして提
案してください。

#3 Updated by Shugo Maeda almost 4 years ago

前田です。

2011年11月30日15:01 Yukihiro Matsumoto matz@ruby-lang.org:

|ただ、今の動作が望ましいかどうかは議論の余地があると思います。

そうですね。「module_evalは定数(やクラス変数)の探索先を変えて
しまったほうが良い」という考えは当然ありえると思いますし、実
際にそう期待している人もそれなりにいるようです。

そのように帰るべきだと考える場合にはfeature proposalとして提
案してください。

たぶんwycatsが反対すると思うので、feature proposalはruby-coreに
出してもらった方がよいと思います。

個人的には、定数は現在のままで、クラス変数はmodule_evalなどの
影響を受ける、という線はアリかなという気がします。
クラス変数に静的スコープっぽい挙動を求める人はあまりいないと
思いますので。

--
Shugo Maeda

#4 Updated by Koichi Sasada over 3 years ago

  • Status changed from Open to Rejected

Also available in: Atom PDF