Instance_eval and constants lookup rules in ruby 1.9


#1

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


#2

On Thu, Apr 16, 2009 at 12:13 AM, Daniel M.
removed_email_address@domain.invalid 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