Ruby on rails 更新类中的哈希值

Ruby on rails 更新类中的哈希值,ruby-on-rails,ruby,ruby-on-rails-3,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" 我需要更改什么,以便放入哈希[:uno]的结果不是“50”,而是10。是否有可能更新类中散

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

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"
我需要更改什么,以便
放入哈希[:uno]
的结果不是
“50”
,而是
10
。是否有可能更新类中散列的值,而不必传递整个散列


这将起作用:
UpdateHash.new(散列)
。但是,我是否只能在类中传递值并更新值?

类似的内容可能是:

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,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

如果要操作任何值并将其传播回调用方级别,则需要捕获对父对象的引用:

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
变量不会更新任何其他引用,如散列中的引用


现在,如果该值是一个
数组
,那么您可以在类中对其进行变异,例如在save方法中添加新元素,这些元素也会反映在散列中。这是可能的,因为对对象的引用(即本例中的数组)在这里没有更改。

将对象作为参数传递给方法时,Ruby会将引用复制到对象。这通常被称为“按对象传递引用”,它又是按值传递系统的一个变体

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

因此,为了更新散列并设置新值,需要对散列本身进行引用。仅将新值设置为
@value
变量不会更新任何其他引用,如散列中的引用


现在,如果该值是一个
数组
,那么您可以在类中对其进行变异,例如在save方法中添加新元素,这些元素也会反映在散列中。这是可能的,因为对对象的引用(即本例中的数组)在这里没有更改。

因为Ruby是按值传递的,所以在不实际接触哈希的情况下,您无法更新哈希中的值(从而可以访问方法中的哈希)。@HolgerJust Ruby是按对象引用传递的,而不是值,这是一个微妙但重要的区别。整数值实际上是单例的,所以它们看起来是按值传递的。@霍尔格你能写下你的评论作为答案吗,这样我就可以投票表决并标记为正确吗?非常感谢@塔德曼:是的,当然。但是引用仍然是按值传递的,这是这里的重要部分。因为Ruby是按值传递的,所以在不实际接触哈希的情况下,您无法更新哈希中的值(从而可以访问方法中的哈希)。@HolgerJust Ruby是按对象引用传递的,而不是按值传递的,这是一个微妙但重要的区别。整数值实际上是单例的,所以它们看起来是按值传递的。@霍尔格你能写下你的评论作为答案吗,这样我就可以投票表决并标记为正确吗?非常感谢@塔德曼:是的,当然。但是引用仍然是通过值传递的,这是这里的重要部分。