2012-06-13 3 views
0

У меня есть класс SampleИнициализация переменной РУБИН

Sample.class возвращает

(id :integer, name :String, date :date) 

и Хэш имеет все заданные атрибуты в качестве его ключей. Тогда как я могу инициализировать переменную Sample без присвоения каждого атрибута независимо.

Что-то вроде

Sample x = Sample.new 

x.(attr) = Hash[attr] 

Как я могу перебирать атрибуты, проблема Хеш содержит ключи, которые не являются частью класса атрибутов слишком

+0

Почему атрибуты должны быть ключами, а не значениями? Я немного потерял это. – Makoto

+0

У меня есть хэш, который имеет атрибуты в качестве ключа, так что я могу сопоставить имя атрибута с хэш-ключом, а затем назначить s.attr значение – user1449980

+0

Взгляните на мой отредактированный ответ. Это может быть дубликат. – sczizzo

ответ

1
class Sample 
    attr_accessor :id, :name, :date 
end 

h = {:id => 1, :name => 'foo', :date => 'today', :extra1 => '', :extra2 => ''} 

init_hash = h.select{|k,v| Sample.method_defined? "#{k}=" } 

# This will work 
s = Sample.new 
init_hash.each{|k,v| s.send("#{k}=", v)} 

# This may work if constructor takes a hash of attributes 
s = Sample.new(init_hash) 
1

Посмотри на this article on Object initialization. Вам нужен метод initialize.

РЕДАКТИРОВАТЬ Вы можете также взглянуть на this SO post on setting instance variables, что, я думаю, именно то, что вы пытаетесь сделать.

+0

Я хочу перебирать атрибуты для инициализации. Есть ли способ сделать это? – user1449980

+0

Несомненно, вы можете сохранить их имена в переменной класса (т. Е. Такой массив, как '@@ attrs = [: id,: name,: date]') и перебрать их позже. – sczizzo

0

Попробуйте это:

class A 
    attr_accessor :x, :y, :z 
end 

a = A.new 
my_hash = {:x => 1, :y => 2, :z => 3, :nono => 5} 

Если вы не имеете список атрибутов, которые могут быть назначены из хэша, вы можете сделать это:

my_attributes = (a.methods & my_hash.keys) 

Используйте a.instance_variable_set(:@x = 1) синтаксис назначать значения:

my_attributes.each do |attr| 
    a.instance_variable_set("@#{attr.to_s}".to_sym, my_hash[attr]) 
end 

Примечание (спасибо Abe): Предполагается, что либо все атрибуты, которые нужно обновить, имеют геттеры и сеттеры, или что любой атрибут, который имеет только getter, не имеет ключа в my_hash.

Удачи вам!

+0

Возможно, вы захотите проверить это с помощью 'attr_reader: nono' в определении класса;) –

+0

@AbeVoelker' my_attributes = (a.methods & my_hash.keys) 'делает это. – Anil

+0

'attr_reader: nono' создаст метод' nono' (reader), но не метод 'nono =' (writer). 'my_attributes = (a.methods & my_hash.keys)' проверяет только методы чтения. Должны ли назначаться атрибуты, у которых нет методов записи? –

Смежные вопросы