From: Simon Chiang Date: 2010-05-02T04:20:29+09:00 Subject: class in instance_eval -- what the namespace? I'm confused as to how the parent constant is determined when you define a class within an instance_eval. It appears that sometimes ruby decides to use a nameless, perhaps temporary class as the parent constant. Interestingly enough, the behavior is different when you use a block vs a string, and ruby implementation to implementation. For example consider this script: [script.rb] obj = Object.new obj.instance_eval do class A; end puts A end puts A rescue puts $!.message obj.instance_eval %q{ class B; end puts B } puts B rescue puts $!.message Running this across several implementations produces a variety of results: % rvm ruby script.rb jruby-1.4.0: jruby 1.4.0 (ruby 1.8.7 patchlevel 174) (2009-11-02 69fbfa3) (Java HotSpot(TM) 64-Bit Server VM 1.6.0_17) [x86_64-java] A A #::B uninitialized constant B rbx-1.0.0-rc4: rubinius 1.0.0-rc4 (1.8.7 release 2010-03-31 JI) [x86_64-apple-darwin10.3.0] A A B B ruby-1.8.7-p249: ruby 1.8.7 (2010-01-10 patchlevel 249) [i686- darwin10.2.0] A A #::B uninitialized constant B ruby-1.9.1-p378: ruby 1.9.1p378 (2010-01-10 revision 26273) [i386- darwin10.2.0] #::A uninitialized constant A #::B uninitialized constant B Any thoughts? And specifically, does anyone know of a way to set the default namespace for the class keyword? Specifying the full constant name like 'class ::A' works to assign the constants and uniformly produce a rubinius-like output but I was wondering if there is another way.