From: "David A. Black" Date: 2008-10-10T00:54:31+09:00 Subject: Re: Enumerating constants in anonymous modules Hi -- On Fri, 10 Oct 2008, Xavier Shay wrote: > How can I enumerate all the constants inside the module in the second > example? > Notice that #constants array is empty See comments in code, below. > For bonus points, which is the "correct" eval method to use to define a > class inside the module (they all seem to work) module_eval and class_eval are synonyms for each other. I'd use module_eval over instance_eval, unless you specifically need instance methods to be singleton methods on the module object (which is unlikely, and can be achieved by other means under module_eval). > module Foo > class A > end > end > > puts Foo.constants.inspect # => ["A"] > > [:module_eval, :instance_eval, :class_eval].each do |method| > m = Module.new > m.send(method) do > class B The constant B is resolved in the usual "semi-static", eager way, which means it does not belong to the new module: it's actually being defined at the top level. > end > end > puts m.constants.inspect # => [] (I would expect ['B']) > puts m.const_get('B').inspect # => B > end Try this: m = Module.new m.module_eval do class self::B # forces Ruby to wait to bind the constant end end puts m.constants.inspect # ["B"] puts m.const_get('B').inspect # #::B David -- Rails training from David A. Black and Ruby Power and Light: Intro to Ruby on Rails January 12-15 Fort Lauderdale, FL Advancing with Rails January 19-22 Fort Lauderdale, FL * * Co-taught with Patrick Ewing! See http://www.rubypal.com for details and updates!