Project

General

Profile

Actions

Bug #6838

closed

class_eval and instance_eval do not scope class names the same as direct code

Added by cpoirier (Chris Poirier) over 12 years ago. Updated over 12 years ago.

Status:
Rejected
Assignee:
-
Target version:
-
ruby -v:
ruby 1.9.3p194 (2012-04-20 revision 35410) [x86_64-darwin11]
Backport:
[ruby-core:47013]

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) over 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) over 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) over 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?

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0