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