2013-02-20 3 views
1

Может кто-нибудь объяснить, почему эти два фрагмента кода не эквивалентны? Либо я что-то упускаю, либо вдавливаю, не делаю то, что я думаю. Дано:Inject не работает как ожидалось

nodes = [{id: 1}, {id: 2}] 

Этот код:

result = Hash.new 
nodes.each do |node| 
    result[node[:id]] = node.inspect 
end 
result 

возвращает

{ 
    1 => "{:id=>1}", 
    2 => "{:id=>2}" 
} 

Но это:

nodes.inject({}) {|hash, node|hash[node[:id]] = node.inspect} 

возвращается:

"{:id=>2}" 

Почему?

ответ

8

INJECT не работает, как ожидалось

Ну, ваши ожидания не правы. :)

Блок до inject/reduce должен возвращать новое значение аккумулятора.

nodes = [{id: 1}, {id: 2}] 
res = nodes.inject({}) {|hash, node| hash[node[:id]] = node.inspect; hash} 
res # => {1=>"{:id=>1}", 2=>"{:id=>2}"} 
+0

Спасибо! Уже поздно, я знаю, что я толстый! – Chris

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