2013-12-21 2 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

ok Получаю благодарность – Steve007

Смежные вопросы