【发布时间】:2018-08-09 23:58:11
【问题描述】:
我正在尝试设置实例变量,而不用单个设置器对我的对象进行穿孔。我想使用我称为 group setter 的方法。
我想遍历对象的instance_variables,对于那些与预先提供的哈希中的键匹配的对象,使用instance_variable_set 单独设置它们。我不想遍历哈希对来限定实例变量的设置,因为这是一个安全问题。
这是我的代码:
class Pickle
attr_accessor :id, :name, :colour, :status
def initialize()
@id = nil
@name = nil
@colour = 'green'
@status = 'new'
end
def into_me(incoming)
instance_variables.each do |i|
puts i
puts incoming[i]
instance_variable_set(i, incoming[i])
end
end
end
a = Pickle.new
# >> @id
# => #<Pickle:0x00007fef6782c978 @colour="green", @id=nil, @name=nil, @status="new">
newstuff = {:name => 'Peter', :colour => 'red'}
a.into_me(newstuff)
# >> @name
# >> @colour
# >> @status
# => #<Pickle:0x00007fef6782c978 @colour=nil, @id=nil, @name=nil, @status=nil>
它很接近,但它似乎无法在哈希中找到提供的键/值对。我不明白为什么它不能使用提供的哈希来查找符号作为键。
我做错了什么?
由于instance_variable 变量类型不匹配,它不是重复的并且之前已回答。如果你读了这篇文章,上面写着It's close, but it can't seem to find the provided key/value pair in the hash. I don't see why it can't use the provided hash to look up symbols as keys.。
【问题讨论】:
-
因为
:name和@name不一样 -
@Joe
:id = nilininitialize()会引发错误。不清楚你指的是哪个。 -
puts incoming[i]永远不会匹配,因为来自instance_variables.each的i正在返回像@name这样的项目,但是您传入的哈希具有像:name这样的符号键 -
不能解析成正确的形式吗?
-
你能解释一下为什么迭代属性与哈希是一个更好的解决方案吗?你可以在这里弄乱字符串,去掉
@,然后调用.to_sym来匹配它们,但这似乎很混乱,因为好处不清楚。