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
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).
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
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
This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.