|| =将hash包装在方法中

时间:2013-12-21 06:10:59

标签: ruby hash

我在方法中放了一个哈希:

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

什么都没有改变?

1 个答案:

答案 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 => {}}

因此,哈希值会更新。