Я искал вокруг, но не могу найти, что любой встроенный способ сделать преобразовывает объект (моего собственного создания) к хешу значений, взгляд в другом месте - также.
Моя мысль состояла в том, чтобы использовать .instance_variables
, разделите @
от передней стороны каждой переменной, и затем используют attr_accessor
чтобы каждый создал хеш.
Что делает Вас, парни думают? Это - 'Ruby Путь' или является там лучшим способом сделать это?
Предполагая, что все данные, которые вы хотите включить в хэш, хранятся в переменных экземпляра:
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}
Я не знаю собственного способа сделать это, но я думаю, что ваша идея просто перебирать все переменные экземпляра и создавать хеш-код - это, в основном, путь. Это довольно просто.
Вы можете использовать Объект.instance_variables
, чтобы получить массив всех переменных экземпляра, которые вы затем перебираете, чтобы получить их значения.
Вам нужен хэш? Или вам просто нужно удобство использования хэша?
если вам нужен хэш, то предложение Джеффа Ланотта в ответе Коди Коглана очень хорошее. в противном случае вы можете перегрузить [] для вашего класса. что-то вроде.
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]