这里我有一个小的演示代码:
class UpdateHash
def initialize(value)
@value = value
save
end
def save
@value = 10
end
end
hash = {uno: "50"}
UpdateHash.new(hash[:uno])
puts hash[:uno]
=> "50"
我需要更改哪些内容,以便puts hash[:uno]
的结果不是"50"
而是10
。是否有可能更新类中哈希的值,而不必传递整个哈希?
这样可行:UpdateHash.new(hash)
。但我能够只传递值并更新类中的值吗?
答案 0 :(得分:3)
当传递对象作为方法的参数时,会发生什么是Ruby复制对象的引用。这通常被称为pass-by-object-reference,而后者又是按值传递系统的变体。
这意味着,虽然您可以改变传递的引用指向的对象,或者甚至更新对新对象的引用(即将新对象设置为现有变量),但您不能强制对同一对象的其他引用指向另一个对象。
因此,为了更新哈希并设置新值,您需要引用哈希本身。只是为@value
变量设置一个新值不会更新任何其他引用,例如哈希中的引用。
现在,如果价值是例如一个Array
你可以在你的课堂内通过例如在save方法中添加新元素,这些元素也会反映在哈希中。这是可能的,因为这里没有改变对象的引用(在这种情况下是数组)。
答案 1 :(得分:1)
或许这样的事情:
class UpdateHash
def initialize(hash,key)
hash[key] = save
end
def save
10
end
end
hash = {uno: "50"}
UpdateHash.new(hash,:uno)
puts hash[:uno] #=> 10
答案 2 :(得分:1)
如果您想操纵任何值并让它们反向传播到调用者的级别,您需要捕获对父对象的引用:
class UpdateHash
def initialize(hash)
@hash = hash
save
end
def save
@hash[:uno] = 10
end
end
hash = {uno: "50"}
UpdateHash.new(hash)
puts hash[:uno]
# => 10