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 的别名)。