初始化变量RUBY

时间:2012-06-13 01:10:40

标签: ruby-on-rails ruby class-variables

我有一个样本

Sample.class返回

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

和散列将所有给定属性作为其键。 那么如何在不独立分配每个属性的情况下初始化Sample变量。

这样的东西
Sample x = Sample.new

x.(attr) = Hash[attr]

如何迭代属性,问题是Hash包含的键也不是类属性的一部分

3 个答案:

答案 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中的键。

祝你好运!