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

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

···

On Thu, Apr 16, 2009 at 12:13 AM, Daniel Mendler <dmendler@wurzelteiler.de> wrote: