From: "cpoirier (Chris Poirier)" Date: 2012-08-06T13:24:29+09:00 Subject: [ruby-core:47014] [ruby-trunk - Bug #6838] class_eval and instance_eval do not scope class names the same as direct code Issue #6838 has been updated by cpoirier (Chris Poirier). 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. ---------------------------------------- Bug #6838: class_eval and instance_eval do not scope class names the same as direct code https://bugs.ruby-lang.org/issues/6838#change-28670 Author: cpoirier (Chris Poirier) Status: Open Priority: Normal Assignee: Category: Target version: ruby -v: ruby 1.9.3p194 (2012-04-20 revision 35410) [x86_64-darwin11] 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. -- http://bugs.ruby-lang.org/