Alle venerdì 14 settembre 2007, Chris Hall ha scritto:
> Not sure if I am attacking this correctly or not, so if anyone has any
> insight, please assist.
>
> Let me setup my situation
>
> class Task
>
>   attr_reader :name
>
>   def initialize(name, &block)
>     @name = name
>
>     instance_eval <<-EOL
>       def run(&block)
>         yield if block_given?
>         # i need the block passed to initialize to go here
>         # but i am not sure how do do it
>       end
>     end
>   end
> end
>
> t = Task.new('do_something') { puts "I want this block to be the guts of
> 'run' method in t instance" }
>
> t.run { "running #{@name}" }
>
>
> basically i want to dynamically create the run method whenever i create
> an instance of a task, and the guts of the run method to be the block
> passed with .new but i also want the ability to have run accept a block
> as well.
>
> any help is appreciated.

I'm not sure whether I understand your question correctly. Can't you store the 
block passed to initialize in an instance variable and call it from run?

class Task

  attr_reader :name

  def initialize(name, &block)
    @name = name
    @block = block
  end

  def run
    yield if block_given?
    @block.call
  end

end

If you need to create the run method dynamically for other reasons, I think 
the simplest way to achieve what you want is still to store the block passed 
to initialize in an instance variable:

class Task
  
  attr_reader :name

  def initialize name, &block
    @name = name
    @block = block
    instance_eval do
      def self.run
       yield if block_given?
       @block.call
      end
    end
  end

end

I hope this helps

Stefano