question about instance_eval, dynamic methods and blocks

C

Chris Hall

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.
 
S

Stefano Crocco

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 help 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 helps

Stefano
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,768
Messages
2,569,574
Members
45,051
Latest member
CarleyMcCr

Latest Threads

Top