# Create a class in a class with eval

**URL:** <https://www.ruby-forum.com/t/create-a-class-in-a-class-with-eval/115455>\
**Category:** Ruby\
**Created:** [September 25, 2007, 2:18pm UTC](https://www.ruby-forum.com/t/create-a-class-in-a-class-with-eval/115455 "2007-09-25T14:18:21Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![gazoduc](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/c5a1d2/32.png) [@gazoduc](https://www.ruby-forum.com/u/gazoduc)\
**Post date:** [September 25, 2007, 2:18pm UTC](https://www.ruby-forum.com/t/create-a-class-in-a-class-with-eval/115455/1 "2007-09-25T14:18:21Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![gazoduc](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/c5a1d2/32.png) [@gazoduc](https://www.ruby-forum.com/u/gazoduc)\
**Post date:** [September 25, 2007, 2:45pm UTC](https://www.ruby-forum.com/t/create-a-class-in-a-class-with-eval/115455/2 "2007-09-25T14:45:25Z")

</div>

Hi –

On Tue, 25 Sep 2007, Gaspard B. wrote:

> 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

---

<div class="post-metadata">

**Author:** ![gazoduc](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/c5a1d2/32.png) [@gazoduc](https://www.ruby-forum.com/u/gazoduc)\
**Post date:** [September 25, 2007, 4:18pm UTC](https://www.ruby-forum.com/t/create-a-class-in-a-class-with-eval/115455/3 "2007-09-25T16:18:41Z")

</div>

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 [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):
