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]);结束代码>