开发者

Converting an object to a hash of values in Ruby

开发者 https://www.devze.com 2023-01-06 08:45 出处:网络
I have searched around, but can\'t find any built-in way to do 开发者_运维百科convert an object (of my own creation) to a hash of values, so must needs look elsewhere.

I have searched around, but can't find any built-in way to do 开发者_运维百科convert an object (of my own creation) to a hash of values, so must needs look elsewhere.

My thought was to use .instance_variables, strip the @ from the front of each variable, and then use the attr_accessor for each to create the hash.

What do you guys think? Is that the 'Ruby Way', or is there a better way to do this?


Assuming all data you want to be included in the hash is stored in instance variables:

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} 


I dont know of a native way to do this, but I think your idea of basically just iterating over all instance variables and building up a hash is basically the way to go. Its pretty straight-forward.

You can use Object.instance_variables to get an Array of all instance variables which you then loop over to get their values.


Just this works

object.instance_values


do you need a hash? or do you just need the convenience of using a hash?

if you need a has Geoff Lanotte's suggestion in Cody Caughlan's answer is nice. otherwise you could overload [] for your class. something like.

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]


Better use, <object>.attributes

it will returns a hash.

It is much more clean solution.

Cheers!

0

精彩评论

暂无评论...
验证码 换一张
取 消