回答:
あなたが探している方法はinstance_variable_set
です。そう:
hash.each { |name, value| instance_variable_set(name, value) }
または、もっと簡単に言えば、
hash.each &method(:instance_variable_set)
(OPの例にあるように)インスタンス変数名に「@」がない場合は、それらを追加する必要があるため、次のようになります。
hash.each { |name, value| instance_variable_set("@#{name}", value) }
hash.each &method(:instance_variable_set)
では、メソッドinstance_variable_set
が必要な2つのパラメータをどのように受け取るかを説明できますか?
h = { :foo => 'bar', :baz => 'qux' }
o = Struct.new(*h.keys).new(*h.values)
o.baz
=> "qux"
o.foo
=> "bar"
.new()
ているのですか?
Struct.new
ハッシュキーに基づいて新しいクラスを作成し、次に2番目のnew
クラスは、作成されたばかりのクラスの最初のオブジェクトを作成し、それをハッシュの値に初期化します。ruby-doc.org/core-1.8.7/classes/Struct.htmlを
Struct.new(*hash.keys.map { |str| str.to_sym }).new(*hash.values)
あなたは私たちを泣かせたいと思っています:)
いずれの場合でも、Object#instance_variable_get
およびを参照してくださいObject#instance_variable_set
。
ハッピーコーディング。
set_entity
すべてのコントローラーにジェネリックコールバックを設定し、既存のインスタンス変数に干渉したくない場合がありますdef set_entity(name, model); instance_variable_set(name, model.find_by(params[:id])); end;
を使用しsend
て、ユーザーが存在しないインスタンス変数を設定できないようにすることもできます。
def initialize(hash)
hash.each { |key, value| send("#{key}=", value) }
end
send
クラスにattr_accessor
インスタンス変数のようなセッターがある場合に使用します。
class Example
attr_accessor :foo, :baz
def initialize(hash)
hash.each { |key, value| send("#{key}=", value) }
end
end
hash.each {|k,v| instance_variable_set("@#{k}",v)}