From: Sean O'Halpin Date: 2009-04-19T10:12:06+09:00 Subject: Re: Reffering back to caller's binding On Sun, Apr 19, 2009 at 2:10 AM, Sean O'Halpin wrote: > On Sat, Apr 18, 2009 at 6:16 PM, Owein Herrmann wrote: >> Hello Rubyists, >> >> I am trying to define a helper method which displays a ruby expression >> and then displays the results of that expression via puts. Initially I >> did this, which obviously did not work: >> >> def peval( expression ) >>  puts expression >>  puts eval( expression ) >>  puts "" >> end >> >> of course when I ran it, the scope of the method does not include >> objects in the calling scope... so then I realized it had to do with >> bindings and I defined this: >> >> def peval >>  f,b = yield >>  puts f >>  puts eval(f,b) >>  puts "" >> end >> >> and this works, but, its really ugly: >> >> peval { ["map.inspect", binding()] } >> >> so my question is, is there a way to obtain the caller's binding so that >> I do not have to specify it in the call? Is this in Pickaxe and I spaced >> out on that section? I eally just want to be able to specify the >> expression (in quotes), get it to display, see the results, move on... > > Explicitly specify the block parameter and use its #binding method to > get the binding for where the block was defined, i.e. > > def peval(&block) >  f,b = block.call >  puts f >  puts eval(f,block.binding) >  puts "" > end > > peval { ["var.inspect"] } > > OUTPUT: > var.inspect > [1, 2, 3] > > Regards, > Sean > I leave it as an exercise for the reader to work out the definition of 'var' ;)