Instance_eval and constants lookup rules in ruby 1.9

D

Daniel Mendler

Hi,

what happend to the constant lookup rules in ruby 1.9? It seems
constants in blocks that are evaluated with instance_eval are looked up
only in the evaluating class but not in the scope the block was defined.

This works in Ruby 1.8 but not in 1.9:
======================================

class X
def run(&block)
instance_eval(&block)
end
end

module A
I_AM_NOT_FOUND = 666
a = X.new
a.run {
puts I_AM_NOT_FOUND
}
end

Ruby 1.8 finds the constants only if they are in the scope where the
block is defined. Why was this behaviour changed?

Daniel
 
B

botp

On Thu, Apr 16, 2009 at 12:13 AM, Daniel Mendler

i should expect that behaviour if using *instance*_eval inside *modules*.

i have many options though (note test2.rb does not use instance_eval)...


botp@jedi-hopeful:~$ cat test?.rb

#--test1.rb------------
class X
def run(&block)
instance_eval(&block)
end
end
module A
I_AM_FOUND = 666
a = X.new
a.run {
puts A::I_AM_FOUND
}
end



#-- test2.rb ---------
class X
def run(&block)
block.call
end
end
module A
I_AM_FOUND = 666
a = X.new
a.run {
puts I_AM_FOUND
}
end



#-- test3.rb -----------
class X
I_AM_FOUND = 666
def run(&block)
instance_eval(&block)
end
end
module A
a = X.new
a.run {
puts I_AM_FOUND
}
end



#-- test4.rb -----------
class X
def run(&block)
instance_eval(&block)
end
end
I_AM_FOUND = 666
a = X.new
a.run {
puts I_AM_FOUND
}

botp@jedi-hopeful:~$


kind regards -botp
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,744
Messages
2,569,484
Members
44,904
Latest member
HealthyVisionsCBDPrice

Latest Threads

Top