首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Ruby:动态生成attribute_accessor

Ruby:动态生成attribute_accessor
EN

Stack Overflow用户
提问于 2011-09-23 18:49:34
回答 3查看 11.4K关注 0票数 21

我正在尝试从散列(使用嵌套散列)生成attr_reader,以便它自动镜像instance_variable创建。

这是我到目前为止所知道的:

代码语言:javascript
复制
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

但是我找不到这样做的方法:

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-09-23 18:56:54

您需要在Event类上调用(私有)类方法attr_accessor

代码语言:javascript
复制
    self.class.send(:attr_accessor, name)

我建议您在下面这一行添加@

代码语言:javascript
复制
    instance_variable_set("@#{name}", value)

并且不要在散列中使用它们。

代码语言:javascript
复制
    data = {:datetime => '2011-11-23', :duration => '90', :class => {:price => '£7', :level => 'all'}}
票数 40
EN

Stack Overflow用户

发布于 2011-09-23 19:01:27

您可以使用method_missing来使用一些元魔法来解决这个问题:

代码语言:javascript
复制
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修改整个类。

票数 5
EN

Stack Overflow用户

发布于 2011-09-23 18:59:22

attr_accessor是一个类方法,因此需要在该类上调用。它也是一个私有方法,因此您需要在类对象为self的上下文中调用它。

举个例子:

代码语言:javascript
复制
class C
  def foo
    self.class.instance_eval do
      attr_accessor :baz
    end
  end
end

在创建一个C实例并在该实例上调用foo之后,该实例以及将来的所有实例都将包含方法bazbaz=

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7527832

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档