|
|
|
|
||||||
![]() |
|
|
LinkBack | Outils de la discussion |
|
|
#1 |
|
Messages: n/a
Hébergeur: |
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 is appreciated. -- Posted via http://www.ruby-forum.com/. |
|
|
|
#2 |
|
Messages: n/a
Hébergeur: |
Alle venerd=C3=AC 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 =3D 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 =3D 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 is appreciated. I'm not sure whether I understand your question correctly. Can't you store = the=20 block passed to initialize in an instance variable and call it from run? class Task attr_reader :name def initialize(name, &block) @name =3D name @block =3D 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= =20 the simplest way to achieve what you want is still to store the block passe= d=20 to initialize in an instance variable: class Task =20 attr_reader :name def initialize name, &block @name =3D name @block =3D block instance_eval do def self.run yield if block_given? @block.call end end end end I hope this s Stefano |
|
![]() |
| Outils de la discussion | |
|
|