Create a class in a class with eval

I need to eval code that will create globally available classes. I tried this :

class Test
  def makeA
    Module.send(:eval, "class A; end")
    # same with: eval "class A; end"
    puts Test.const_get('A') # => Test::A
    puts Module.const_get('A') # => raise NameError, why ?
  end
end

eval "class B; end"
puts Module.const_get('B') # => B

Test.new.makeA #=> bang

Thanks for your help.

Gaspard

Hi --

···

On Tue, 25 Sep 2007, Gaspard Bucher wrote:

I need to eval code that will create globally available classes. I tried this :

class Test
def makeA
   Module.send(:eval, "class A; end")
   # same with: eval "class A; end"
   puts Test.const_get('A') # => Test::A
   puts Module.const_get('A') # => raise NameError, why ?
end
end

eval "class B; end"
puts Module.const_get('B') # => B

Test.new.makeA #=> bang

You could do:

   Module.module_eval "class A; end"

or (preferable, in my opinion):

   Module.const_set("A", Class.new)

David

--
Upcoming training from Ruby Power and Light, LLC:
   * Intro to Ruby on Rails, Edison, NJ, October 23-26
   * Advancing with Rails, Edison, NJ, November 6-9
Both taught by David A. Black.
See http://www.rubypal.com for more info!

Thanks for the answer. Works great.

I just changed Module to Object since:
Object.const_set("A", Class.new) ==> A
Module.const_set("A", Class.new) ==> Module::A

···

2007/9/25, David A. Black <dblack@rubypal.com>:

Hi --

On Tue, 25 Sep 2007, Gaspard Bucher wrote:

> I need to eval code that will create globally available classes. I tried this :
>
> class Test
> def makeA
> Module.send(:eval, "class A; end")
> # same with: eval "class A; end"
> puts Test.const_get('A') # => Test::A
> puts Module.const_get('A') # => raise NameError, why ?
> end
> end
>
> eval "class B; end"
> puts Module.const_get('B') # => B
>
> Test.new.makeA #=> bang

You could do:

   Module.module_eval "class A; end"

or (preferable, in my opinion):

   Module.const_set("A", Class.new)

David

--
Upcoming training from Ruby Power and Light, LLC:
   * Intro to Ruby on Rails, Edison, NJ, October 23-26
   * Advancing with Rails, Edison, NJ, November 6-9
Both taught by David A. Black.
See http://www.rubypal.com for more info!