2013-12-21 29 views
1

我把散列中的方法:|| =與散列包裹在一個方法

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 

沒有什麼改變?

回答

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

因此,散列被更新。

+0

好的我明白了 – Steve007