2010-07-09 56 views
5

我已经搜索了周围,但无法找到任何内置方式将对象(我自己创建的对象)转换为值的哈希值,因此必须在别处查找。将对象转换为Ruby中值的哈希

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

你们认为什么?那是'Ruby Way',还是有更好的方法来做到这一点?

+0

如果,或许,你碰巧使用Rails。 '.attributes'会抓住你想要的。 – 2010-07-09 03:10:36

+0

您也可以使用'hashable'gem http://stackoverflow.com/a/17889367/960702 – mustafaturan 2013-07-26 19:25:50

回答

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} 
+0

最后,我去了一个更简单的版本(没有.map)。 – Dukeh 2010-07-20 22:02:53

+0

@Dukeh,请问您可以添加您的简单版本作为另一个答案吗? – PlagueHammer 2015-08-12 23:55:24

1

我不知道一个原生的方式来做到这一点,但我认为你基本上只是遍历所有实例变量和构建一个哈希的想法基本上是要走的路。它非常直接。

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

+1

同意,如果您需要多次执行某些操作,则可以使用to_hash方法扩展Class。 – 2010-07-09 03:15:10

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] 
-1

更好地利用,<object>.attributes

它会返回一个hash

这是更干净的解决方案。

干杯!

1

就在这个工程

object.instance_values

相关问题