2

我正在尝试根据我传递给其方法MyObject的哈希来动态定义已初始化的 Ruby 对象上的方法。在方法的主体中,我有以下内容:my_hashinitializeinitialize

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​​ 方法来获取我想要的值会更方便。

4

2 回答 2

4

局部变量在定义它们的范围内是局部的。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)来迭代键。

于 2015-01-25T14:11:46.010 回答
2

您可以使用define_singleton_method而不是class << self. 另请注意,这会Hash#each产生一个包含键和值的二元数组。

my_hash.each do |key, val|
  define_singleton_method(key.underscore.to_sym) do
    val
  end
end
于 2015-01-25T14:07:29.400 回答