Asp Forum
Home
|
Login
|
Register
|
Search
Forums
>
comp.lang.ruby
Enumerating constants in anonymous modules
Xavier Shay
10/9/2008 3:22:00 PM
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-...
.
2 Answers
David A. Black
10/9/2008 3:55:00 PM
0
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 # #<Module:0x220164>::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.r...
for details and updates!
Xavier Shay
10/9/2008 4:04:00 PM
0
David A. Black wrote:
> 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).
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
--
Posted via
http://www.ruby-...
.
Servizio di avviso nuovi messaggi
Ricevi direttamente nella tua mail i nuovi messaggi per
Enumerating constants in anonymous modules
Inserendo la tua e-mail nella casella sotto, riceverai un avviso tramite posta elettronica ogni volta che il motore di ricerca troverà un nuovo messaggio per te
Il servizio è completamente GRATUITO!
x
Login to ForumsZone
Login with Google
Login with E-Mail & Password