From: jonathan@... Date: 2014-12-03T15:23:42+00:00 Subject: [ruby-core:66662] [ruby-trunk - Bug #10564] DelegateClass, method_missing, and instance_eval -- different behavior in ruby 2.1 Issue #10564 has been updated by jonathan rochkind. Oh, and you can note `Kernel.raise` and `Kernel.puts` in the reproduction -- this was neccesary to actually access `raise` and `puts`, otherwise just raw `raise` or `puts` also got unexpectedly caught by method_missing (causing an infinite recursion running out of stack in this case) ---------------------------------------- Bug #10564: DelegateClass, method_missing, and instance_eval -- different behavior in ruby 2.1 https://bugs.ruby-lang.org/issues/10564#change-50271 * Author: jonathan rochkind * Status: Open * Priority: Normal * Assignee: * Category: * Target version: * ruby -v: 2.1.3p242 * Backport: 2.0.0: UNKNOWN, 2.1: UNKNOWN ---------------------------------------- This is an odd one, I don't completely understand. But there is different behavior in ruby 2.0 vs 2.1, and the 2.0 behavior is what I'd expect. Not sure if it's a bug, expected difference in behavior, or something else. Here is a minimized reproduction: ~~~ require 'delegate' class DelegateWithMethodMissing < DelegateClass(Object) def method_missing sym, *args, &block if sym == :lambda Kernel.raise Exception.new("Why is it catching lambda?") end Kernel.puts "Caught method missing for `#{sym}` with args: #{args}" end end o = DelegateWithMethodMissing.new( Object.new ) o.instance_eval do missing_method "value" missing_method_with_lambda_value lambda {|a| a} end ~~~ On 2.0.0p576, this produces: Caught method missing for `missing_method` with args: ["value"] Caught method missing for `missing_method_with_lambda_value` with args: [#] On 2.1.3p242, this instead raises the exception: Caught method missing for `missing_method` with args: ["value"] .test.rb:7:in `method_missing': Why is it catching lambda? (Exception) Somehow the `lambda` inside the `instance_eval` is being caught by `method_missing`, instead of accessing the ordinary lambda keyword. If I remove the `method_missing` definition, then `lambda` can work as expected again, which is even more confusing. -- https://bugs.ruby-lang.org/