我正在尝试根据传递给其initialize
方法的哈希my_hash
在初始化的 Ruby 对象MyObject
上动态定义方法。在initialize
方法的主体中,我有以下内容:
my_hash.each do |key|
class << self
define_method(key.underscore.to_sym) do
my_hash[key]
end
end
end
此操作失败,并显示undefined local variable or method 'key' for #<Class:#<MyObject:0x007fc7abw0cra0>>
。知道为什么吗?
my_hash
是由具有大量驼化键的 json 响应组成的,因此使用简单的 ruby 方法来获取我想要的值更方便。
局部变量是定义它们的范围的局部变量。Ruby 中的(词法)作用域是脚本作用域、模块/类定义作用域、方法定义作用域和块作用域。只有块作用域嵌套在其外部作用域中(即关闭其周围的作用域)。因此,您必须使用块:
my_hash.each_key do |key|
singleton_class.class_eval do
define_method(key.to_sym) do
my_hash[key]
end
end
end
甚至更好:
my_hash.each_key do |key|
define_singleton_method(key.underscore.to_sym) do
my_hash[key]
end
end
注意:我还修复了一个错误,您应该使用 each_key
而不是 each
(这是 each_pair
的别名)迭代键。
define_singleton_method
而不是class << self
。另请注意,Hash#each
生成一个包含键和值的双元素数组。
my_hash.each do |key, val|
define_singleton_method(key.underscore.to_sym) do
val
end
end