Bug #6838
closedclass_eval and instance_eval do not scope class names the same as direct code
Description
class X
def self.f()
puts "::X"
end
end
class Y
class X
def self.f()
puts "Y::X"
end
end
def self.c()
X.f()
end
end
Y.class_eval do
def self.k()
X.f()
end
end
Y.c
Y.class_eval { X.f() }
Y.k
====
Y.c outputs "Y::X"
Y.class_eval { X.f() } outputs "::X"
Y.k also outputs "::X"
Similar behaviour happens with instance_eval:
====
class X
def f()
puts "::X"
end
end
class Y
class X
def f()
puts "Y::X"
end
end
def c()
X.new.f()
end
end
Y.new.c
Y.new.instance_eval { X.new.f() }
====
My expectation is that class_eval and instance_eval should map class names the same as code written directly in the class, as they do with function names.
Updated by cpoirier (Chris Poirier) about 12 years ago
On more thought, I can understand that Ruby views class names the same way it does variables, and so pulls them from the binding. It just doesn't feel like it's the right behaviour, in this context.
Updated by shugo (Shugo Maeda) about 12 years ago
- Status changed from Open to Rejected
cpoirier (Chris Poirier) wrote:
My expectation is that class_eval and instance_eval should map class names the same as code written directly in the class, as they do with function names.
The current behavior is intended.
From the documentation of Module#class_eval:
Evaluates the string or block in the context of _mod_, except that when
a block is given, constant/class variable lookup is not affected.
This is because constants are searched statically rather than dynamically in Ruby.
Updated by alexeymuranov (Alexey Muranov) about 12 years ago
I think constants are searched "half-dynamically", as, for example, inheritance hierarchy is searched, but only after the visual "indented" hierarchy. Is #6810 related?