views:

59

answers:

3

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?

thanks.

+1  A: 

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.

Cody Caughlan
Agreed and if it is something you needed to do more than once, you could just extend Class with a to_hash method.
Geoff Lanotte
A: 

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]
potatopeelings
A: 

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} 
Lars Haugseth
In the end I went with a simpler version of this (without the .map).
Dukeh