更新 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 中改变它,例如在您的保存方法中添加新元素,这些元素也会反映在哈希中。这是可能的,因为对对象的引用(即本例中的数组)未在此处更改。
这里我有一个小演示代码:
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 中改变它,例如在您的保存方法中添加新元素,这些元素也会反映在哈希中。这是可能的,因为对对象的引用(即本例中的数组)未在此处更改。