2014-02-18 8 views
0

У меня есть array из hash значения:Уменьшает массив Рубиновых хэш

> taxes = [{:name=>"foo", :rate=>0.5}, {:name=>"bar", :rate=>2.5}] 
=> [{:name=>"foo", :rate=>0.5}, {:name=>"bar", :rate=>2.5}] 

Это работает подытожить ставки:

> taxes.reduce(0) {|sum,element|sum + element[:rate]} 
=> 3.0 

Есть еще один способ сделать это, что может быть более понятным и лаконично?

** редактировать **

Для сравнения (да, я понимаю, что это просто массив):

>> [1,2,3].reduce(:+) 
=> 6 
+1

Что случилось с тем, что у вас есть? Вы хотите что-то более короткое? – Linuxios

+0

Вам нравится 'tax.collect {| h | h [: rate]} .reduce (0,: +) # => 3.0'? –

+4

Существует разница между непонятным текстом, и читатель просто незнаком с чем-то. Функциональная нотация не только очень красноречива, но может стать наиболее понятной нотацией, когда читатель знаком с функциональными понятиями. –

ответ

4

Может быть, используя общую «карту» и «уменьшить» функции понятнее ?

taxes.map { |t| t[:rate] }.reduce(:+) # => 3.0 
+0

Честно говоря, я нахожу это более запутанным. Я не вижу ничего плохого в оригинальной версии. – nzifnab

+0

@nzifnab: ya, этот вопрос субъективен. – maerics

+0

Я считаю, что это решение медленнее, потому что оно повторяется дважды, одна карта и другие уменьшают. Я не ошибаюсь? –

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