更新类中的哈希值

时间:2017-01-06 18:05:59

标签: ruby-on-rails ruby ruby-on-rails-3

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

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)。但我能够只传递值并更新类中的值吗?

3 个答案:

答案 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