Ruby - 与对象的特征类共享局部变量
Ruby - Share local variable with the obj's eigenclass
我正在尝试根据传递给其 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 方法获取我想要的值会更方便。
您可以使用 define_singleton_method
rather than class << self
. Also note that Hash#each
生成一个包含键和值的二元素数组。
my_hash.each do |key, val|
define_singleton_method(key.underscore.to_sym) do
val
end
end
局部变量在它们定义的范围内是局部的。Ruby 中的(词法)范围是脚本范围、module/class 定义范围、方法定义范围和块范围。只有块作用域嵌套在它们的外部作用域中(也就是关闭它们周围的作用域)。所以,你必须使用一个块:
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
的别名)。
我正在尝试根据传递给其 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 方法获取我想要的值会更方便。
您可以使用 define_singleton_method
rather than class << self
. Also note that Hash#each
生成一个包含键和值的二元素数组。
my_hash.each do |key, val|
define_singleton_method(key.underscore.to_sym) do
val
end
end
局部变量在它们定义的范围内是局部的。Ruby 中的(词法)范围是脚本范围、module/class 定义范围、方法定义范围和块范围。只有块作用域嵌套在它们的外部作用域中(也就是关闭它们周围的作用域)。所以,你必须使用一个块:
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
的别名)。