我正在尝试从散列(使用嵌套散列)生成attr_reader,以便它自动镜像instance_variable创建。
这是我到目前为止所知道的:
data = {:@datetime => '2011-11-23', :@duration => '90', :@class => {:@price => '£7', :@level => 'all'}}
class Event
#attr_reader :datetime, :duration, :class, :price, :level
def init(data, recursion)
data.each do |name, value|
if value.is_a? Hash
init(value, recursion+1)
else
instance_variable_set(name, value)
#bit missing: attr_accessor name.to_sym
end
end
end
但是我找不到这样做的方法:
发布于 2011-09-23 18:56:54
您需要在Event
类上调用(私有)类方法attr_accessor
:
self.class.send(:attr_accessor, name)
我建议您在下面这一行添加@
:
instance_variable_set("@#{name}", value)
并且不要在散列中使用它们。
data = {:datetime => '2011-11-23', :duration => '90', :class => {:price => '£7', :level => 'all'}}
发布于 2011-09-23 19:01:27
您可以使用method_missing来使用一些元魔法来解决这个问题:
class Event
def method_missing(method_name, *args, &block)
if instance_variable_names.include? "@#{method_name}"
instance_variable_get "@#{method_name}"
else
super
end
end
end
这将允许通过object.variable语法访问对象实例变量(如果对象定义了这些变量),而无需通过attr_accessor修改整个类。
发布于 2011-09-23 18:59:22
attr_accessor
是一个类方法,因此需要在该类上调用。它也是一个私有方法,因此您需要在类对象为self
的上下文中调用它。
举个例子:
class C
def foo
self.class.instance_eval do
attr_accessor :baz
end
end
end
在创建一个C
实例并在该实例上调用foo
之后,该实例以及将来的所有实例都将包含方法baz
和baz=
。
https://stackoverflow.com/questions/7527832
复制相似问题