我在方法中放了一个哈希:
def example
@_hash ||= {:a => {}, :b => {}}
end
我从另一个方法调用该哈希,并将键/值添加到子哈希中,如下所示:
example[:a][:c] = "test"
这会将哈希值更改为:
{:a => {:c => "test"}, :b => {}}
我不明白为什么我仍然可以通过再次调用方法来更新:c
哈希:
example[:a][:c] = "test2" #=> {:a => {:c => "test2"}, :b => {}}
这很奇怪,因为如果@_hash
不是nil
/ false
,则等号/或运算符不应再次分配值。所以我假设我们example.[]= method
来改变单个散列键/值的值。如果这是真的,那么当我从哈希方法中删除||=
时,为什么会这样呢:
def example
@_hash = {:a => {}, :b => {}}
end
什么都没有改变?
答案 0 :(得分:2)
这样做的原因是,当您再次调用example
方法时,它会正确返回以下哈希:
example #=> {:a => {:c => "test"}, :b => {}} # variable like syntax
example() #=> {:a => {:c => "test"}, :b => {}} # method like syntax
但是,当你这样做时:
example[:a][:c] = "test2"
你真正做的是:
hash = example() #=> {:a => {:c => "test"}, :b => {}}
hash[:a][:c] = "test2" #=> {:a => {:c => "test2"}, :b => {}}
因此,哈希值会更新。