Преобразование объекта в хэш значений в Ruby - PullRequest
5 голосов
/ 09 июля 2010

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

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

Что вы, ребята, думаете?Это «Рубиновый путь» или есть лучший способ сделать это?

Ответы [ 5 ]

3 голосов
/ 09 июля 2010

Предполагая, что все данные, которые вы хотите включить в хеш, хранятся в переменных экземпляра:

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} 
1 голос
/ 24 июня 2016

Просто это работает

object.instance_values ​​

1 голос
/ 09 июля 2010

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

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

0 голосов
/ 21 мая 2015

Лучше использовать, <object>.attributes

, он вернет hash.

Это намного более чистый раствор.

Ура!

0 голосов
/ 09 июля 2010

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

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

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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...