Sean O'Halpin
4/19/2009 1:12:00 AM
On Sun, Apr 19, 2009 at 2:10 AM, Sean O'Halpin <sean.ohalpin@gmail.com> wro=
te:
> On Sat, Apr 18, 2009 at 6:16 PM, Owein Herrmann <oherrmann@gmail.com> wro=
te:
>> 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 )
>> =A0puts expression
>> =A0puts eval( expression )
>> =A0puts ""
>> 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
>> =A0f,b =3D yield
>> =A0puts f
>> =A0puts eval(f,b)
>> =A0puts ""
>> 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)
> =A0f,b =3D block.call
> =A0puts f
> =A0puts eval(f,block.binding)
> =A0puts ""
> 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=
' ;)