[lnkForumImage]
TotalShareware - Download Free Software

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


 

Forums >

comp.lang.ruby

What's wrong with my metaprogramming?

John Ky

10/14/2006 3:15:00 PM

>>>>>
def define_my_method(method_name)
define_method method_name do
yield
end
end

class X
define_my_method :method1 do
puts "Method 1"
end
define_my_method :method2 do
puts "Method 2"
method1
end
end

X.new.method2
<<<<<

Gives:

C:\wrk\johnk\wiksprint-001>define.rb
Method 2
C:/wrk/johnk/wiksprint-001/define.rb:13: undefined local variable or method `met
hod1' for X:Class (NameError)
from C:/wrk/johnk/wiksprint-001/define.rb:3:in `method2'
from C:/wrk/johnk/wiksprint-001/define.rb:17

4 Answers

dblack

10/14/2006 3:23:00 PM

0

Marcin Mielzynski

10/14/2006 3:27:00 PM

0

John Ky wrote:

try this one:

def define_my_method(method_name,&blk)
define_method method_name, &blk
end


class X
define_my_method :method1 do
puts "Method 1"
end
define_my_method :method2 do
puts "Method 2"
method1
end
end

X.new.method2


lopex

Ara.T.Howard

10/14/2006 3:28:00 PM

0

Trans

10/14/2006 3:36:00 PM

0

John Ky wrote:
> >>>>>
> def define_my_method(method_name)
> define_method method_name do
> yield
> end
> end

Yea, funny thing about Ruby, closures go a long ways. Have a look at
what self is in one fo your definitions:

> class X
> define_my_method :method1 do
> puts "Method 1"
> end
> define_my_method :method2 do
> puts "Method 2"
p self
> method1
> end
> end
>
> X.new.method2

This is why define_method takes a block. So a fix would be:

def define_my_method(method_name, &block)
define_method method_name, &block
end

Unfortuantely that's not always the prefect solution since you might
want to wrap extra code around the yield . In that case, you can use
#instance_eval if you don't need to pass parameters. If you do need to
pass parameters you'll have to use more complicated tricks until 1.9
introduces #instance_exec.

On a related note, I still think it would be helpful if we could create
clean-closure blocks.

T.