Yan*_*all 20 ruby attr-accessor
我正在尝试从散列(使用嵌套散列)生成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
Run Code Online (Sandbox Code Playgroud)
但我找不到办法做到这一点:(
rdv*_*ijk 36
您需要在类attr_accessor上调用(私有)类方法Event:
self.class.send(:attr_accessor, name)
Run Code Online (Sandbox Code Playgroud)
我建议你@在这一行添加:
instance_variable_set("@#{name}", value)
Run Code Online (Sandbox Code Playgroud)
并且不要在哈希中使用它们.
data = {:datetime => '2011-11-23', :duration => '90', :class => {:price => '£7', :level => 'all'}}
Run Code Online (Sandbox Code Playgroud)
您可以使用 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
Run Code Online (Sandbox Code Playgroud)
这将允许通过 object.variable 语法访问对象实例变量,如果对象定义了这些变量,而无需通过 attr_accessor 修改整个类。
| 归档时间: |
|
| 查看次数: |
9855 次 |
| 最近记录: |