Answers:
您正在寻找的方法是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
接收它需要的两个参数?
h = { :foo => 'bar', :baz => 'qux' }
o = Struct.new(*h.keys).new(*h.values)
o.baz
=> "qux"
o.foo
=> "bar"
.new()
做什么?
Struct.new
基于哈希键创建一个新类,然后第二new
个创建刚创建的类的第一个对象,并将其初始化为Hash的值。参见ruby-doc.org/core-1.8.7/classes/Struct.html
require 'ostruct'; h = {:foo => 'foo'}; o = OpenStruct.new(h); o.foo == 'foo'
Struct.new(*hash.keys.map { |str| str.to_sym }).new(*hash.values)
set_entity
对所有控制器都使用通用回调,并且不想干扰现有的实例变量def set_entity(name, model); instance_variable_set(name, model.find_by(params[:id])); end;
hash.each {|k,v| instance_variable_set("@#{k}",v)}