更新 class 中的哈希值

Update hash value in class

这里我有一个小演示代码:

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。是否可以更新 class 中的哈希值,而不必传递整个哈希?

这可行:UpdateHash.new(hash)。但是我只能传递值并更新 class 中的值吗?

也许是这样的:

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

如果您想操作任何值并让它们反向传播到调用者的级别,您需要捕获对父对象的引用:

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

当将对象作为参数传递给方法时,发生的情况是 Ruby 复制对对象的引用。这通常称为按对象引用传递,它又是按值传递系统的变体。

这意味着虽然您可以改变传递的引用指向的对象,甚至可以将引用更新为指向新对象的指向(即将新对象设置为现有变量),但您不能强制对同一对象的其他引用指向不同的对象。

因此,为了更新散列并设置新值,您需要引用散列本身。只是为 @value 变量设置一个新值不会更新任何其他引用,例如散列中的引用。

现在,如果值是一个 Array 你可以在你的 class 中改变它,例如在您的保存方法中添加新元素,这些元素也会反映在哈希中。这是可能的,因为对对象的引用(即本例中的数组)未在此处更改。