【问题标题】:How to get a hash of an instance's all attr_accessor fields? [duplicate]如何获取实例的所有 attr_accessor 字段的哈希? [复制]
【发布时间】:2016-12-01 11:47:37
【问题描述】:

我们有一个attr_accessors 的课程。如:

class Class
  attr_accessor :x
  attr_accessor :y

  ...

end

我想从这个类的一个实例创建一个散列。如:

c.to_attr_hash = { :x => "x", :y => "y" }

这是怎么做到的?

【问题讨论】:

    标签: ruby oop attributes


    【解决方案1】:
    class Class
      attr_accessor :x
      attr_accessor :y
    
      def to_attr_hash
        hash = Hash.new
        instance_variables.each do |v|
          hash[v] = instance_variable_get(v)
        end
        hash
      end
    end
    
    c = Class.new
    
    c.x = 'a'
    c.y = 'b'
    
    p c.to_attr_hash
    
    #=> {:@x=>"a", :@y=>"b"}
    

    【讨论】:

    • 更简洁(更类似于 ruby​​)的解决方案是:instance_variables.each_with_object({}) { |var, hash| hash[var] = instance_variable_get(var) }
    • 这列出了实例变量,而不是attr_accessors。顺便说一句,像Class这样的猴子补丁核心类只能小心veeeeery,如果真的别无选择。
    • 试试c = Class.new; c.instance_variable_set(:@i_am_not_an_attr_accessor, 42); c.to_attr_hash,你会发现两个attr_accessor都没有出现,而attr_accessor没有出现 i> 出现。
    猜你喜欢
    • 2015-01-02
    • 2011-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-31
    相关资源
    最近更新 更多