On Wed, 2006-03-15 at 00:20 +0900, Mark Volkmann wrote:
> In the following code the do_this instance method of the foo object
> calls yield to run the block that is passed to it.
> 
> foo.do_this(p1, p2) {
>   do_that(p3, p4)
> }
> 
> Is there any way to make it so that do_that is executed in the context
> of the foo object, i.e. it acts as though it was invoked with
> foo.do_that(p3, p4)?  I know I could just say "foo.do_that(p3, p4)",
> but I was wondering if I could avoid that.

If you're writing 'foo' then you can do:

	class Foo   
	  def do_this(&blk)
	    instance_eval &blk
	  end

	  def do_that
	    puts "Doing that..."
	  end
	end

	f.do_this { do_that }
	# (prints) Doing that...

	# can use this form, too
	f.do_this { |foo| foo.do_that }
	# (prints) Doing that...

There's a few subtleties to using instance_eval you might want to look
up, but maybe it does the job...

-- 
Ross Bamford - rosco / roscopeco.REMOVE.co.uk