迭代并设置Ruby对象实例变量
我正在寻找一种迭代Ruby对象实例变量的方法,并使用通用setter(从提供的散列)单独设置它们。我假设我可以在一个方法中直接遍历它们,并简单地分别设置它们 这是我的对象实例u:迭代并设置Ruby对象实例变量,ruby,setter,instance-variables,Ruby,Setter,Instance Variables,我正在寻找一种迭代Ruby对象实例变量的方法,并使用通用setter(从提供的散列)单独设置它们。我假设我可以在一个方法中直接遍历它们,并简单地分别设置它们 这是我的对象实例u: u = #<Waffle:0x00007fc6b1145530 @id=nil, @alpha="", @bravo="", @charlie="", @delta=nil, @echo=nil, @status=new> 这是我的方法,它抛出了以
u = #<Waffle:0x00007fc6b1145530
@id=nil,
@alpha="",
@bravo="",
@charlie="",
@delta=nil,
@echo=nil,
@status=new>
这是我的方法,它抛出了以下错误:
def to_obj(h)
self.instance_variables.each do |i|
self.i = h[i.sub('@','')]
end
end
错误:
Traceback (most recent call last):
3: from /users/rich/app.rb:31:in `<main>'
2: from /Library/WebServer/Documents/dingbat/models/waffle.rb:240:in `to_obj'
1: from /Library/WebServer/Documents/dingbat/models/waffle.rb:240:in `each'
/Library/WebServer/Documents/dingbat/models/waffle.rb:241:in `block in to_obj': no implicit conversion of String into Integer (TypeError)
回溯(最近一次呼叫最后一次):
3:from/users/rich/app.rb:31:in`'
2:from/Library/WebServer/Documents/dingbat/models/waffle.rb:240:in'to_obj'
1:from/Library/WebServer/Documents/dingbat/models/waffle.rb:240:in'each'
/Library/WebServer/Documents/dingbat/models/waffle.rb:241:'block in to_obj'中:没有将字符串隐式转换为整数(TypeError)
self.instance\u变量实际上是一个符号数组
我认为对象可以在给定哈希值的情况下设置其实例变量。这不难
def to_obj(h)
h.each{|k, v| instance_variable_set("@{k}", v)}
end
如果要仅在定义了该实例变量时设置值,请执行以下操作:
def to_obj(h)
h.each do
|k, v|
next unless instance_variable_defined?("@{k}")
instance_variable_set("@{k}", v)
end
end
如果要仅在定义了该实例变量时设置值,请执行以下操作:
def to_obj(h)
h.each do
|k, v|
next unless instance_variable_defined?("@{k}")
instance_variable_set("@{k}", v)
end
end
您需要instance\u variable\u set
method您需要instance\u variable\u set
method出于安全原因,我正在迭代对象的ivar,并根据散列进行相应的设置,而不是相反。Cheers@SergioTulentsev提供的散列可能大于我想要实际修改的实例变量数组。因此,如果我限定了实例变量,我只能设置这些变量,而不是让散列占据主导地位。@Stefan:是的,但是如果某个东西设置了一个“未知”的实例变量,它将不会被任何东西使用(除了基于反射的序列化或其他东西)。另外,这个质量分配是“不可预测的”(取决于对象中的哪些实例变量当前处于“活动”状态)@Rich\u F:如果您将“可设置”实例变量列为白名单(我们在这个线程中没有证据),那么是的。但在这种情况下,您也可以过滤哈希键。是白名单增加了安全性,而不是反转。@SergioTulentsevinstance_variables
似乎就是白名单。出于安全原因,我正在迭代对象的IVAR,并根据哈希进行相应的设置,而不是相反。Cheers@SergioTulentsev提供的散列可能大于我想要实际修改的实例变量数组。因此,如果我限定了实例变量,我只能设置这些变量,而不是让散列占据主导地位。@Stefan:是的,但是如果某个东西设置了一个“未知”的实例变量,它将不会被任何东西使用(除了基于反射的序列化或其他东西)。另外,这个质量分配是“不可预测的”(取决于对象中的哪些实例变量当前处于“活动”状态)@Rich\u F:如果您将“可设置”实例变量列为白名单(我们在这个线程中没有证据),那么是的。但在这种情况下,您也可以过滤哈希键。增加安全性的是白名单,而不是反转。@SergioTulentsevinstance_variables
似乎就是白名单。