0

私はクラスのサンプルを持っています

Sample.class が返す

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

ハッシュは、指定されたすべての属性をキーとして持ちます。次に、各属性を個別に割り当てずに Sample の変数を初期化するにはどうすればよいですか。

何かのようなもの

Sample x = Sample.new

x.(attr) = Hash[attr]

属性を反復処理するにはどうすればよいですか。問題は、クラス属性の一部ではないキーがハッシュに含まれていることです

4

3 に答える 3

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)
于 2012-06-13T02:05:58.470 に答える
1

オブジェクトの初期化に関するこの記事をご覧ください。initializeメソッドが必要です。

EDITインスタンス変数の設定に関するこの SO の投稿もご覧ください。これはまさにあなたがやろうとしていることだと思います。

于 2012-06-13T01:17:57.743 に答える
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

注 (阿部さんに感謝): これは、更新されるすべての属性に getter と setter があるか、getter のみを持つ属性が my_hash にキーを持っていないことを前提としています。

幸運を!

于 2012-06-13T05:06:36.957 に答える