【问题标题】:Converting an object to a hash of values in Ruby在 Ruby 中将对象转换为值的哈希值
【发布时间】:2011-03-13 16:16:25
【问题描述】:

我已经四处搜索,但找不到任何内置方法将(我自己创建的)对象转换为值的哈希值,因此必须在别处寻找。

我的想法是使用.instance_variables,从每个变量的前面去掉@,然后为每个变量使用attr_accessor 来创建哈希。

你们怎么看?这是 'Ruby Way',还是有更好的方法来做到这一点?

【问题讨论】:

标签: ruby hash object


【解决方案1】:

假设您希望包含在哈希中的所有数据都存储在实例变量中:

class Foo
  attr_writer :a, :b, :c

  def to_hash
    Hash[*instance_variables.map { |v|
      [v.to_sym, instance_variable_get(v)]
    }.flatten]
  end
end

foo = Foo.new
foo.a = 1
foo.b = "Test"
foo.c = Time.now
foo.to_hash
 => {:b=>"Test", :a=>1, :c=>Fri Jul 09 14:51:47 0200 2010} 

【讨论】:

  • 最后我选择了一个更简单的版本(没有 .map)。
  • @Dukeh,您能否在此处添加您更简单的版本作为另一个答案?
【解决方案2】:

我不知道执行此操作的本地方法,但我认为您基本上只是迭代所有实例变量并建立哈希的想法基本上是要走的路。它非常简单。

您可以使用Object.instance_variables 获取所有实例变量的数组,然后您可以循环获取它们的值。

【讨论】:

  • 同意,如果您需要多次执行此操作,您可以使用 to_hash 方法扩展 Class。
【解决方案3】:

这行得通

object.instance_values

【讨论】:

    【解决方案4】:

    你需要一个哈希吗?还是您只需要使用哈希的便利?

    如果您需要 Geoff Lanotte 在 Cody Caughlan 的回答中的建议,那就太好了。否则你可以为你的班级重载 [] 。类似的东西。

    class Test
        def initialize v1, v2, v3
            @a = x
            @b = y
            @c = z
        end
    
        def [] x
            instance_variable_get("@" + x)
        end
    end
    
    n = Test.new(1, 2, 3)
    p n[:b]
    

    【讨论】:

      【解决方案5】:

      更好用,<object>.attributes

      它将返回一个hash

      这是更干净的解决方案。

      干杯!

      【讨论】:

        猜你喜欢
        • 2020-09-15
        • 2011-06-29
        • 2016-02-05
        • 2017-04-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-12
        • 2021-12-09
        相关资源
        最近更新 更多