From: alxtskrnk@... Date: 2017-12-28T16:40:09+00:00 Subject: [ruby-core:84548] [Ruby trunk Bug#13774] for methods defined from procs, the binding of the resulting bound_method.to_proc does not have access to the original proc's closure environment Issue #13774 has been updated by bughit (bug hit). nobu (Nobuyoshi Nakada) wrote: > I think it is not a bug. > > Local variables are not set up in the context of a binding from a method. > > ```ruby > $ ruby -e 'def m(v=12);v;end; p method(:m).to_proc.binding.eval("v")' > Traceback (most recent call last): > 2: from -e:1:in `
' > 1: from -e:1:in `eval' > -e:1:in `': undefined local variable or method `v' for main:Object (NameError) > ``` You are accessing a local variable in the method (which does not exist until the method is invoked), whereas I am accessing a variable outside the method, captured by the proc that defined the method, which does exist outside the invocation of the method. So your example does not explain the behavior that I am highlighting. To try answer my own question, I can see how this might not be a bug if method.to_proc returns a proc that is no way related to the proc that defined the method. Such a proc simply forwards the args to the method and knows nothing about the original proc binding. I initially thought that it would somehow inherit the binding of the original proc. ---------------------------------------- Bug #13774: for methods defined from procs, the binding of the resulting bound_method.to_proc does not have access to the original proc's closure environment https://bugs.ruby-lang.org/issues/13774#change-69083 * Author: bughit (bug hit) * Status: Open * Priority: Normal * Assignee: * Target version: * ruby -v: ruby 2.5.0p0 (2017-12-25 revision 61468) [x86_64-linux] * Backport: 2.2: UNKNOWN, 2.3: UNKNOWN, 2.4: UNKNOWN ---------------------------------------- ```ruby def foo o = Object.new local_var = 'local_var' method_lambda = ->{local_var} o.define_singleton_method(:lambda_method, &method_lambda) method_proc = o.method(:lambda_method).to_proc puts method_proc.() puts eval('local_var', method_lambda.binding) puts o.lambda_method puts eval('local_var', method_proc.binding) # undefined local variable or method `local_var' end foo ``` when executed as a method it has access to local_var as expected but the binding of the bound method proc does not in ruby 2.2.2 the above code crashes the vm -- https://bugs.ruby-lang.org/ Unsubscribe: