Project

General

Profile

Actions

Bug #5689

closed

class variables inside of instance methods inside of "class_eval"

Added by shyouhei (Shyouhei Urabe) almost 13 years ago. Updated over 12 years ago.

Status:
Rejected
Assignee:
-
Target version:
ruby -v:
-
Backport:
[ruby-dev:44906]

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

Updated by shugo (Shugo Maeda) almost 13 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の動作に戻したように記憶しています。

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

Updated by matz (Yukihiro Matsumoto) almost 13 years ago

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

まつもと ゆきひろです

In message "Re: [ruby-dev:44907] [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 writes:

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

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

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

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

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

Updated by shugo (Shugo Maeda) almost 13 years ago

前田です。

2011年11月30日15:01 Yukihiro Matsumoto :

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

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

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

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

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

--
Shugo Maeda

Updated by ko1 (Koichi Sasada) over 12 years ago

  • Status changed from Open to Rejected
Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0