在Ruby中将对象转换为值的哈希值

时间:2010-07-09 03:03:58

标签: ruby hash object

我已经搜索过,但找不到任何内置的方法来将对象(我自己创建的)转换为值的哈希值,因此必须要查看其他地方。

我的想法是使用.instance_variables,从每个变量的前面剥离@,然后使用attr_accessor创建每个变量。

你们觉得怎么样?那是“Ruby Way”,还是有更好的方法来做到这一点?

5 个答案:

答案 0 :(得分:3)

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

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} 

答案 1 :(得分:1)

我不知道这样做的本地方法,但我认为你基本上只是迭代所有实例变量并构建哈希的想法基本上就是要走的路。它很直接。

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

答案 2 :(得分:1)

只是这个工作

object.instance_values

答案 3 :(得分:0)

你需要哈希吗?或者你只是需要使用哈希的便利?

如果你需要一个拥有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]

答案 4 :(得分:-1)

更好地使用,<object>.attributes

它将返回hash

这是更清洁的解决方案。

干杯!