我有一个样本
Sample.class返回
(id :integer, name :String, date :date)
和散列将所有给定属性作为其键。 那么如何在不独立分配每个属性的情况下初始化Sample变量。
像
这样的东西Sample x = Sample.new
x.(attr) = Hash[attr]
如何迭代属性,问题是Hash包含的键也不是类属性的一部分
答案 0 :(得分:1)
看看this article on Object initialization。您需要initialize
方法。
编辑你也可以看看this SO post on setting instance variables,我认为这正是你想要做的。
答案 1 :(得分: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)
答案 2 :(得分: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中的键。
祝你好运!