On Oct 25, 2006, at 3:54 PM, dblack / wobblini.net wrote:

> Hi --
>
> On Thu, 26 Oct 2006, Morton Goldberg wrote:
>
>> On Oct 25, 2006, at 3:31 PM, Gavin Kistner wrote:
>>
>>> From: Morton Goldberg [mailto:m_goldberg / ameritech.net]
>>>> I'd rather pass in a block. Is there a way to do that? Something  
>>>> like:
>>>> <pseud-code>
>>>> module Kernel
>>>>    def tell(obj, &to_do)
>>>>       # what goes here?
>>>>    end
>>>> end
>>>> tell Foo.new do
>>>>    report
>>>>    eat 'burger', 'fries'
>>>>    drink 'beer'
>>>>    be_merry
>>>> end
>>>> </pseud-code>
>>> def tell( obj, &to_do )
>>>  obj.instance_eval( &to_do )
>>> end
>>> class Foo
>>>  def say_hi
>>>    p "Hi!"
>>>  end
>>> end
>>> tell Foo.new do
>>>  say_hi
>>> end
>>> #=> "Hi!"
>>
>> It's really that easy? Amazing! Ruby makes things so easy compared  
>> with the other languages I've used that I'm constantly inventing  
>> hard ways of doing what is too obvious for me to see.
>
> It's easy, but it can also be a bit obfuscating.  For example:
>
>   class C
>     def initialize(thing)
>       @thing = thing
>     end
>
>     def tell(&block)
>       instance_eval(&block)
>     end
>   end
>
>   c = C.new("Hi")
>
>   @thing = "Hello"
>   c.tell do
>     puts @thing        # Hi
>   end
>
> So you get some perhaps unwanted variable-shadowing, and similarly
> with method calls.

I would expect that behavior and, in the situation I'm dealing with,  
I think it's an acceptable trade-off.

Regards, Morton