Enumerating constants in anonymous modules

How can I enumerate all the constants inside the module in the second
example?
Notice that #constants array is empty

For bonus points, which is the "correct" eval method to use to define a
class inside the module (they all seem to work)

Cheers,
Xavier

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
    end
  end
  puts m.constants.inspect # => [] (I would expect ['B'])
  puts m.const_get('B').inspect # => B
end

···

--
Posted via http://www.ruby-forum.com/.

Hi --

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 # #<Module:0x220164>::B

David

···

On Fri, 10 Oct 2008, Xavier Shay wrote:

--
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!

David A. Black wrote:

Hi --

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).

I'm not really sure what I need, I'll do some more reading and come back
if I have any further questions. Using module_eval for now.

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 # #<Module:0x220164>::B

This does what I want, cheers

···

On Fri, 10 Oct 2008, Xavier Shay wrote:

--
Posted via http://www.ruby-forum.com/\.