В Ruby, как я могу получить переменные экземпляра в хэш вместо массива? - PullRequest
10 голосов
/ 14 мая 2010

У меня есть класс Ruby. Я хочу получить переменную экземпляра из аргумента метода в этом классе. Я могу получить все переменные экземпляра в виде массива:

self.instance_variables

Однако я хочу получить переменную экземпляра с именем arg, а именно:

class MyClass
  def get_instance_variable(arg)
    hash_of_instance_variables[arg]
  end
end

object.get_instance_variable('my_instance_var')

Как мне вычислить hash_of_instance_variables?

Ответы [ 4 ]

19 голосов
/ 07 декабря 2011

Чтобы создать хеш всех переменных экземпляра, вы можете использовать следующий код:

class Object
  def instance_variables_hash
    Hash[instance_variables.map { |name| [name, instance_variable_get(name)] } ]
  end
end

Но, как упомянуто в его комментарии cam , вместо него следует использовать метод instance_variable_get:

object.instance_variable_get :@my_instance_var
7 голосов
/ 20 октября 2014

Вопрос довольно старый, но нашел решение для этого: instance_values ​​

Это первый ответ в Google, поэтому, возможно, он кому-нибудь поможет.

1 голос
/ 07 декабря 2011
class MyClass    
def variables_to_hash
      h = {}
      instance_variables.each{|a|
        s = a.to_s
        n = s[1..s.size]
        v = instance_variable_get a
        h[n] = v
      }
      h
    end
end
0 голосов
/ 26 марта 2016

В Ruby on Rails есть пара встроенных способов сделать это, которые вы можете найти отвечающими вашим потребностям.

user = User.new (первый: 'brian', последний: 'case')

user.attributes

{"first" => "brian", "last" => "case"}

user.serializeable_hash

{"first" => "brian", "last" => "case"}

...