也許我已經習慣了 React 的 initialState,但是我嘗試在 Ruby 中做類似的事情,我注意到它在我初始化它的任何地方都會更新哈希。
這是一個例子:
iniatializing_hash = {likes_count: 0, comments_count: 0}
hash_that_uses_initializer = {first: iniatializing_hash, second: iniatializing_hash}
# update first
hash_that_uses_initializer[:first][:likes_count] = 1
hash_that_uses_initializer[:first][:comments_count] = 1
# expect both first and second were updated
puts "first: #{hash_that_uses_initializer[:first].inspect} and second: #{hash_that_uses_initializer[:second].inspect}"
# returns first: {:likes_count=>1, :comments_count=>1} and second: {:likes_count=>1, :comments_count=>1}
我猜這是因為它保持與記憶體中加載哈希的位置的連接。
是否有另一種優雅的方式在 Ruby 中使用“initialState”哈希?
謝謝!
uj5u.com熱心網友回復:
哈希是通過參考傳遞的。當您分配iniatializing_hash時,它不會分配哈希的副本 - 它分配一個指標。當您更改分配給 的哈希值時:first,您也在更改哈希值,:second因為它們都是相同的哈希值。
您可以通過呼叫物件上的方法來證明它們在記憶體中的位置相同object_id:
echo('same hash') if iniatializing_hash.object_id == hash_that_uses_initializer[:first].object_id == hash_that_uses_initializer[:second].object_id
如果你想要一個副本,那么你需要一個深拷貝。
def deep_copy(initial_hash)
Marshal.load(Marshal.dump(initial_hash))
end
hash_that_uses_initializer = {first: deep_copy(iniatializing_hash), second: deep_copy(iniatializing_hash)}
現在存盤在:first和的哈希:second將彼此完全不同,并且不同于iniatializing_hash
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/489075.html
