我有一個類樣品初始化變量RUBY
Sample.class返回
(id :integer, name :String, date :date)
和哈希具有所有給定的屬性作爲其鍵。 那麼我怎樣才能初始化一個變量的樣本沒有獨立分配每個屬性。
喜歡的東西
Sample x = Sample.new
x.(attr) = Hash[attr]
我如何可以通過屬性迭代,問題是哈希包含密鑰,其不是類屬性的一部分太
我有一個類樣品初始化變量RUBY
Sample.class返回
(id :integer, name :String, date :date)
和哈希具有所有給定的屬性作爲其鍵。 那麼我怎樣才能初始化一個變量的樣本沒有獨立分配每個屬性。
喜歡的東西
Sample x = Sample.new
x.(attr) = Hash[attr]
我如何可以通過屬性迭代,問題是哈希包含密鑰,其不是類屬性的一部分太
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)
看看this article on Object initialization。你想要一個initialize
方法。
編輯你也可以看看this SO post on setting instance variables,我認爲這正是你想要做的。
我想遍歷inizialization的屬性。有沒有辦法做到這一點? – user1449980
當然,你可以將他們的名字保存到一個類變量(即一個類似'@@ attrs = [:id,:name,:date]'的數組)並稍後循環。 – sczizzo
試試這個:
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中沒有鍵。
祝你好運!
可能想在類定義中用'attr_reader:nono'來測試它;) –
@AbeVoelker'my_attributes =(a.methods&my_hash.keys)'這樣做。 – Anil
'attr_reader:nono'將創建一個'nono'(reader)方法,但不是'nono ='(writer)方法。 'my_attributes =(a.methods&my_hash.keys)'只檢查閱讀器方法。應該分配哪些屬性沒有寫入器方法? –
爲什麼這些屬性是鍵而不是值?我有點失落。 – Makoto
我有一個散列,它具有作爲關鍵字的屬性,因此我可以使用散列鍵映射屬性的名稱,然後分配s.attr值 – user1449980
看看我編輯的答案。這可能是重複的。 – sczizzo