Преобразование объекта к хешу значений в Ruby

Я искал вокруг, но не могу найти, что любой встроенный способ сделать преобразовывает объект (моего собственного создания) к хешу значений, взгляд в другом месте - также.

Моя мысль состояла в том, чтобы использовать .instance_variables, разделите @ от передней стороны каждой переменной, и затем используют attr_accessor чтобы каждый создал хеш.

Что делает Вас, парни думают? Это - 'Ruby Путь' или является там лучшим способом сделать это?

5
задан Nakilon 11 September 2015 в 12:49
поделиться

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} 
3
ответ дан 15 December 2019 в 00:48
поделиться

Я не знаю собственного способа сделать это, но я думаю, что ваша идея просто перебирать все переменные экземпляра и создавать хеш-код - это, в основном, путь. Это довольно просто.

Вы можете использовать Объект.instance_variables , чтобы получить массив всех переменных экземпляра, которые вы затем перебираете, чтобы получить их значения.

1
ответ дан 15 December 2019 в 00:48
поделиться

Вам нужен хэш? Или вам просто нужно удобство использования хэша?

если вам нужен хэш, то предложение Джеффа Ланотта в ответе Коди Коглана очень хорошее. в противном случае вы можете перегрузить [] для вашего класса. что-то вроде.

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]
0
ответ дан 15 December 2019 в 00:48
поделиться