# About searching constant

**URL:** <https://www.ruby-forum.com/t/about-searching-constant/156663>\
**Category:** Ruby\
**Created:** [December 31, 2008, 3:21pm UTC](https://www.ruby-forum.com/t/about-searching-constant/156663 "2008-12-31T15:21:32Z")\
**Posts on this page:** 6\
**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:** [December 31, 2008, 3:21pm UTC](https://www.ruby-forum.com/t/about-searching-constant/156663/1 "2008-12-31T15:21:32Z")

</div>

class A  
WHY = “I don’t know why!!”

def self.foo  
instance\_eval(“WHY”)  
end  
end

puts A.instance\_eval { foo } # =\> I don’t know why!!  
puts A.instance\_eval(“WHY”) # =\> uninitialized constant Class::WHY  
(NameError)

###############

# Help Me^^

###############

---

<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:** [January 1, 2009, 8:10am UTC](https://www.ruby-forum.com/t/about-searching-constant/156663/2 "2009-01-01T08:10:27Z")

</div>

Weird, if you use A.instance\_eval(“self::WHY”) it simply works… can  
anyone  
explain it?

---

<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:** [January 1, 2009, 9:57am UTC](https://www.ruby-forum.com/t/about-searching-constant/156663/3 "2009-01-01T09:57:55Z")

</div>

It also works if you change instance\_eval to class\_eval (or  
module\_eval).

However I’m not entirely sure of the difference between the former and  
the latter two.

---

<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:** [January 2, 2009, 10:27am UTC](https://www.ruby-forum.com/t/about-searching-constant/156663/4 "2009-01-02T10:27:28Z")

</div>

Kyung won Cheon wrote:

> class A  
> WHY = “I don’t know why!!”

Umm … You already posted this question, and I answered it.  
Did you not like the answer?

[http://www.ruby-forum.com/topic/170583](http://www.ruby-forum.com/topic/170583)

Also as Brian mentioned, module\_eval/class\_eval works.

An invisible parameter is passed to a block (search for cases of  
specific\_eval in eval.c) which is used for constant lookups.

For A.module\_eval { } and A.class\_eval { }, that invisible parameter  
is A. But for A.instance\_eval { }, it is A’s singleton class.

The constant lies in A, not in A’s singleton class.

---

<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:** [January 2, 2009, 3:56pm UTC](https://www.ruby-forum.com/t/about-searching-constant/156663/5 "2009-01-02T15:56:31Z")

</div>

Bernardo Rufino wrote:

> Weird, if you use A.instance\_eval(“self::WHY”) it simply works… can  
> anyone  
> explain it?

Because that’s the same as A::WHY

(i.e. inside foo.instance\_eval { … }, self is foo)

---

<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:** [January 5, 2009, 2:35am UTC](https://www.ruby-forum.com/t/about-searching-constant/156663/6 "2009-01-05T02:35:49Z")

</div>

Mike G. wrote:

> An invisible parameter is passed to a block (search for cases of  
> specific\_eval in eval.c) which is used for constant lookups.
> 
> For A.module\_eval { } and A.class\_eval { }, that invisible parameter  
> is A. But for A.instance\_eval { }, it is A’s singleton class.
> 
> The constant lies in A, not in A’s singleton class.

> You must be inside “class  
> A” (or “module A”) to get the constant lookup of WHY == A::WHY.

I understand it now…

Thank you!!
