【发布时间】:2011-02-26 21:14:07
【问题描述】:
我一直在尝试在 Ruby 1.9 中动态定义一些实例方法。这是我一直用来尝试的代码:
class Testing
[:one, :two].each do |name|
define_method(name) do
puts __method__
end
end
end
这是输出:
ruby-1.9.2-p180 :008 > t = Testing.new
=> #<Testing:0x00000100961878>
ruby-1.9.2-p180 :009 > t.one
two
=> nil
ruby-1.9.2-p180 :010 > t.two
two
=> nil
ruby-1.9.2-p180 :011 >
我希望结果分别为one 和two。如果我在迭代之外调用每个define_method,它会按预期工作。我在这里不明白什么?
这是我在网上看到的在迭代中调用 define_method 的众多示例之一。 Dynamically defined setter methods using define_method?
缺少什么?
另外:使用__method__ 对我来说并不重要,但这是我可以展示的最佳方式,似乎只有发送到define_method 的最后一个块被用于定义的方法。也许这开始向我解释问题,但我仍然不明白..
【问题讨论】:
-
我尝试了您的代码,在这里它完美运行,
t.one打印 "one"。 -
这可能是我的 ruby 版本中的错误吗? *编辑:作为记录,这在 Ruby 1.8 中有效
-
行为在此处确认 (1.9.2),t.one 打印“两个”。闻起来像虫子。
标签: ruby