Kyung won Cheon wrote:
> class A
>   WHY = "I don't know why!!"
> 
>   def self.foo
>     WHY
>   end
> end
> 
> puts A.instance_eval("foo")  # => I don't know why!!
> puts A.instance_eval("WHY")  # => uninitialized constant Class::WHY
> (NameError)
> 
> # What's difference?
> # Help Me^^

A.instance_eval { foo }  # => "I don't know why!!"
A.instance_eval { constants }  # => ["WHY"]
A.instance_eval { const_get "WHY" }  # => "I don't know why!!"
class A ; eval "WHY" ; end  # => "I don't know why!!"

Constants follow different rules for lookup.

instance_eval changes the 'self' for method lookups, but you are still 
in the top-level scope for constant lookups.  You must be inside "class 
A" (or "module A") to get the constant lookup of WHY == A::WHY.

Note the complementary case,

B = Class.new {
  WHEREAMI = "here"
}

WHEREAMI  # => "here"

Despite being defined inside the instance of B, this constant lies in 
the top-level scope.

-- 
Posted via http://www.ruby-forum.com/.