Ruby元编程:动态实例变量名

Ruby元编程:动态实例变量名,ruby,metaprogramming,instance-variables,Ruby,Metaprogramming,Instance Variables,假设我有以下散列: { :foo => 'bar', :baz => 'qux' } 如何动态设置键和值,使其成为对象中的实例变量 class Example def initialize( hash ) ... magic happens here... end end 。。。因此,我在模型内部完成了以下内容 @foo = 'bar' @baz = 'qux' 你让我们想哭:) 在任何情况下,请参见和 快乐编码。您正在寻找的方法是。因此: 或者更简单地说 ha

假设我有以下散列:

{ :foo => 'bar', :baz => 'qux' }
如何动态设置键和值,使其成为对象中的实例变量

class Example
  def initialize( hash )
    ... magic happens here...
  end
end
。。。因此,我在模型内部完成了以下内容

@foo = 'bar'
@baz = 'qux'
你让我们想哭:)

在任何情况下,请参见和


快乐编码。

您正在寻找的方法是。因此:

或者更简单地说

hash.each &method(:instance_variable_set)
如果实例变量名缺少“@”(如OP示例中所示),则需要添加它们,这样更像:

hash.each { |name, value| instance_variable_set("@#{name}", value) }

您还可以使用
send
,防止用户设置不存在的实例变量:

def initialize(hash)
  hash.each { |key, value| send("#{key}=", value) }
end
class Example
  attr_accessor :foo, :baz
  def initialize(hash)
    hash.each { |key, value| send("#{key}=", value) }
  end
end
当类中有一个setter(如
attr\u accessor)用于实例变量时,请使用
send

def initialize(hash)
  hash.each { |key, value| send("#{key}=", value) }
end
class Example
  attr_accessor :foo, :baz
  def initialize(hash)
    hash.each { |key, value| send("#{key}=", value) }
  end
end

那很有趣。。。第二个链式
.new()
到底在做什么?@Andrew:
Struct.new
根据散列键创建一个新类,然后第二个
new
创建刚刚创建的类的第一个对象,并将其初始化为散列值。看,这实际上是一个非常好的方法,因为Struct就是为了这个而做的<代码>需要“ostruct”;h={:foo=>'foo'};o=OpenStruct.new(h);o、 foo=='foo'
我必须将我的键映射到符号:
Struct.new(*hash.keys.map{str | str.to_sym})。new(*hash.values)
在1.9.3中对我不起作用。我用这个来代替hash.each{k,v{124; instance_variable_set(“@{k}”,v)}还有另一个喜欢Rubycan你可以解释一下在
hash.each和method(:instance_variable_set)
中,方法
instance_variable_set
接收它需要的两个参数吗?你知道如何递归地这样做吗?(如果输入哈希中有多个级别)呃,是的,我忍不住想。。。为什么?什么时候使用它比较合适?例如,我可能希望对所有控制器都有一个通用的
set\u实体
回调,并且我不想干扰现有的实例变量
def set\u实体(名称、模型);实例变量集(名称、模型、查找依据(参数[:id]);结束