【发布时间】:2015-08-13 05:32:13
【问题描述】:
我想了解define_method 的工作原理以及如何正确使用定义块之外的变量。这是我的代码:
class Test
def self.plugin
for i in 1..2
define_method("test#{i}".to_sym) do
p i
end
end
end
plugin
end
ob = Test.new
ob.test1 #=> 2 (I would expect 1)
ob.test2 #=> 2 (I would expect 2)
似乎在test1和test2方法中,i的值在定义时没有被替换,而是在调用方法时直接当场计算。所以我们只看到i 的最新值,即2。但是 Ruby 是从哪里获取这个值的呢?有没有办法让test#{i} 打印i?
在这种特殊情况下,我可以做一个workaround using __method__,但可能有更好的解决方案。
【问题讨论】:
-
closure 的力量在这里表达............ :)
-
感谢您的链接,该问题解决了同样的问题。但我不确定那里是否提供了解决方案。至少有一个 cmets 不起作用:
class Test for name in [ :new, :create, :destroy ] local_name = name define_method("test_#{local_name}") do puts local_name end end end ob = Test.new ob.test_new #=> 销毁(我希望是“新”) ob.test_create #=> 销毁(我希望是“新”) -
嗯.. 未标记。但这里是similar post。
-
我完全从您提到的similar post 中获取了代码(对不起标记)。只是想指出该解决方案仅在第二条评论中提出,它不起作用:-)
-
我无法解析“...
i的值不是...”部分。
标签: ruby metaprogramming