2015-06-08 2 views
1

Я работаю над изучением некоторых операций Хэша в рубине. Код - это увеличение цены каждого предмета на 10%. Почему этот код не работает?Почему этот рубиновый код работает должным образом?

restaurant_menu = { "Ramen" => 3, "Dal Makhani" => 4, "Coffee" => 2 } 
restaurant_menu.each do |item, price| 
    price = price + (price * 0.1) 
end 

в то время как это делает:

restaurant_menu = { "Ramen" => 3, "Dal Makhani" => 4, "Coffee" => 2 } 
restaurant_menu.each do |item, price| 
    restaurant_menu[item] = price + (price * 0.1) 
end 

И никаких причин, почему последняя является лучшим способом сделать это, чем прежний, как объяснено Manfrin @ Mike?

+0

Еще один вопрос Ruby, возникающий из-за непонимания того, как работает мутация объекта. – Ajedi32

+0

Можете ли вы объяснить или дать некоторые ссылки, чтобы я мог понять мутацию объекта в ruby.I хочу закрыть этот вопрос, как тогда было задано. @ Ajedi32 –

+0

Вот на самом деле я почему-то упоминал об этом; Я не знаю канонического источника, объясняющего эту концепцию. – Ajedi32

ответ

5

В первой вы устанавливаете переменную от price по новой цене, а затем ее отбрасывают. item и price относятся только к той линии, на которой они используются.

Во втором примере вы устанавливаете переменную restaurant_menu, которая существует за пределами каждого блока, поэтому эти изменения сохраняются после завершения работы блока each.

+0

@ MikeManfrin.Это было быстро, но не следует писать то, что мы пишем в цену в своей локальной области, на свой глобальный родительский объект? –

+0

@ Anony-mouse Я получаю то, что вы пытаетесь сказать, но нет такой вещи, как «глобальный родительский объект». Ruby просто не работает. У вас есть пример языка, который это делает? – Ajedi32

+0

@ Ajedi32.Спасибо за объяснение мне, что. Но каковы преимущества этого способа, чем первый? –

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