2012-06-13 67 views
0

我有一個類樣品初始化變量RUBY

Sample.class返回

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

和哈希具有所有給定的屬性作爲其鍵。 那麼我怎樣才能初始化一個變量的樣本沒有獨立分配每個屬性。

喜歡的東西

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) 
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和setter,或者任何只有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)'只檢查閱讀器方法。應該分配哪些屬性沒有寫入器方法? –