Instance_eval and constants lookup rules in ruby 1.9

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

On Thu, Apr 16, 2009 at 12:13 AM, Daniel M.
[email protected] wrote:

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