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