Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby-与obj';s特征类_Ruby_Metaprogramming_Eigenclass - Fatal编程技术网

Ruby-与obj';s特征类

Ruby-与obj';s特征类,ruby,metaprogramming,eigenclass,Ruby,Metaprogramming,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 my_hash.each do|键| 类您可以使用而不是类局部变量是它们定义的

我正试图根据传递给其
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
my_hash.each do|键|

类您可以使用而不是
类局部变量是它们定义的范围的局部变量。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

注意:我还修复了一个bug,您应该使用
每个密钥
迭代密钥,而不是
每个密钥
(这是
每个密钥对
的别名)。

将哈希转换为OpenStruct,这将为每个密钥创建一个方法。但这不会使MyObject对象上的方法可用,是吗?除非我以某种方式重新定义方法_,将调用传递给OpenStruct object.Brilliant。谢谢,Jörg.Yep,这正是我需要的。如果你编辑解释第一句话,我会投你一票。
my_hash.each_key do |key|
  define_singleton_method(key.underscore.to_sym) do
    my_hash[key]
  end
end