Stefano Crocco
9/14/2007 5:03:00 PM
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