From: Josh Cheek Date: 2011-11-14T12:16:37+09:00 Subject: Re: Binding#with --0016364d237f12d26304b1a94c82 Content-Type: text/plain; charset=ISO-8859-1 On Sun, Nov 13, 2011 at 8:30 PM, Intransition wrote: > Binding#with > > def with(_local_variables) > eval("Proc.new{ |#{_local_variables.keys.join(',')}| binding > }").call(*_local_variables.values) > end > > Try it: > > b = binding.with(:a=>1) > b.eval('a') #=> 1 > > Note I had to explicitly define this in Binding to avoid the private method invocation. > Now, it there a way to add a "yield" to the binding? I tried: > > def with(_local_variables, &_yields) > eval("lambda{ |#{_local_variables.keys.join(',')},&yields| binding > }").call(*_local_variables.values, &_yields) > end > > b = binding.with{ |x| x+x} > b.eval('yields[1]') #=> 2 > > Note that this didn't work for me unless I passed a hash to Binding#with, because otherwise the syntax it generates looks like `lambda{ |,&yields| binding }` which is a syntax error > but > > b.eval('yield(1)') #=> Error > > Seems doubtful, b/c I think `yield` only exists in methods, not in procs (this is just based on behaviour I've experienced, not on an implementation level knowledge) def l() yield 1 end method(:l).call { |x| x + x } # => 2 vs lambda { yield 1 }.call { |x| x + x } # ~> -:1:in `block in
': no block given (yield) (LocalJumpError) --0016364d237f12d26304b1a94c82--