# Def .. end is ok and class .. end is not ok .. Why?

**URL:** <https://www.ruby-forum.com/t/def-end-is-ok-and-class-end-is-not-ok-why/146122>\
**Category:** Ruby\
**Created:** [August 18, 2008, 9:08am UTC](https://www.ruby-forum.com/t/def-end-is-ok-and-class-end-is-not-ok-why/146122 "2008-08-18T09:08:56Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![Kyung\_won\_C](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/k/47e85d/32.png) [@Kyung\_won\_C](https://www.ruby-forum.com/u/Kyung_won_C)\
**Post date:** [August 18, 2008, 9:08am UTC](https://www.ruby-forum.com/t/def-end-is-ok-and-class-end-is-not-ok-why/146122/1 "2008-08-18T09:08:56Z")

</div>

module M  
end

M.module\_eval { def self.a; puts ‘ok’ end }  
M.a

# =\> ‘ok’

M.module\_eval { class A; end }  
M::A

# =\> uninitialized constant M::A (NameError)

---

<div class="post-metadata">

**Author:** ![Kyung\_won\_C](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/k/47e85d/32.png) [@Kyung\_won\_C](https://www.ruby-forum.com/u/Kyung_won_C)\
**Post date:** [August 18, 2008, 9:29am UTC](https://www.ruby-forum.com/t/def-end-is-ok-and-class-end-is-not-ok-why/146122/2 "2008-08-18T09:29:23Z")

</div>

2008/8/18 Kyung won Cheon [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> # =\> uninitialized constant M::A (NameError)

Constants (including class and module names) are lexically scoped (at  
least in Ruby 1.8). Your code therefore defines the top-level class A.  
If you want a nested constant, you could do

M.module\_eval { class self::A; end }

Regards,  
Pit
