我无法从 for 循环中获取变量。似乎 i(var) 是稍后计算的,而不是我完全需要的类定义。
ree-1.8.7-2010.02 > class Pat
ree-1.8.7-2010.02 ?> for i in 39..47
ree-1.8.7-2010.02 ?> define_method("a#{i}".to_sym) do
ree-1.8.7-2010.02 > puts i
ree-1.8.7-2010.02 ?> end
ree-1.8.7-2010.02 ?> end
ree-1.8.7-2010.02 ?> end
#=> 39..47
ree-1.8.7-2010.02 > p = Pat.new
#=> #<Pat:0x103c31140>
ree-1.8.7-2010.02 > p.a39
47
#=> nil
ree-1.8.7-2010.02 > p.a49
NoMethodError: undefined method `a49' for #<Pat:0x103c31140>
from (irb):69
from :0
ree-1.8.7-2010.02 > p.a40
47
#=> nil
我应该使用 def 吗?如果是这样,我怎样才能获得我在此处使用 def 获得的动态方法名称。
最佳答案
那里发生的事情有点微妙...您正在使用的传统 for 循环在所有迭代中共享单个“i”变量...闭包( block 密码到 define_method)正在捕获“i” - 并且因为只有一个“i”,它们都将(在 for 循环的末尾)捕获“i”的最终值,这是您正在循环的范围内的最后一个值。
替代方案:
class C
(1..10).each {|i| define_method("a#{i}") { puts i } }
end
关于ruby-on-rails - define_method 在调用方法之前不使用变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5554793/