2014-07-24 48 views
1

我想用红宝石Metaprograming和传递参数

define_method 

另一个函数中定义的红宝石的方法。示例代码如下。

def demo(method_name) 
    variable = 5 
    define_method "#{method_name}" do 
     #stuff 
    end 
end 

里面的新定义的方法,我希望能够访问该变量:以前定义

variable=5 

。例如,我希望能够做到:

define_method "#{method_name}" do 
     return variable*variable 
    end 

并得到变量平方。

我希望能够到:

demo("squared") 
x = squared # => 25 

有没有一种方法,我可以通过变量“变量”到define_method即使它是不是在同一个范围?

+2

你差不多完成了。什么是*阻止*你? –

+0

嗯,我不确定,但是'do #stuff end'与'variable = 5'的范围相同。即使我错了,该块可以访问母亲的范围*。检查这个:'a = 42; l = - > do; b = 22; l2 = - > do; 放一个; 结束; 结束; l.call.call;'*我不确定正确的标题,所以我弥补了这一点。 –

+0

我很困惑。您显示的代码完全符合您的要求。那么,你的问题是什么? –

回答

4

当然,你有什么工作。有什么问题?

[15] pry(main)> def demo(method_name)  
[15] pry(main)* variable = 5  
[15] pry(main)* define_method "#{method_name}" do  
[15] pry(main)*  variable * variable   
[15] pry(main)* end   
[15] pry(main)* end  
=> :demo 
[16] pry(main)> demo('squared') 
=> :squared 
[17] pry(main)> squared 
=> 25