[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

question about instance_eval, dynamic methods and blocks

Chris Hall

9/14/2007 4:45:00 PM

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.
--
Posted via http://www.ruby-....

1 Answer

Stefano Crocco

9/14/2007 5:03:00 PM

0

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