Ruby - 与 obj 的特征类共享局部变量



我正在尝试根据传递给其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

相关内容

  • 没有找到相关文章

最新更新