Вы можете использовать .select
вместе с .sum
, которые являются методами перечислимого класса и класса массива
def odd_sum(arr)
arr.select{|i| i % 2 == 0}.sum
end
# но так как вы имеете дело с массивом целых чисел, вы можете использовать .odd?
, который делает то же самое, что и i % 2 == 0
, как показано @Rajagopalan answer
def odd_sum(arr)
arr.select{|i| i.odd? }.sum
#or the shorthand version: arr.select(&:odd?).sum
end
Альтернативный синтаксис, в котором вы можете передать блок на .sum
Здесь мы вычитаем число из суммы, если оно четное. Это немного менее читабельно, но допустимый синтаксис и на самом деле менее эффективен для вашего варианта использования. См. Тесты.
def odd_sum(arr)
arr.sum {|i| i.odd? ? i : 0}
end
Тесты, основанные на комментарии @max к другому опубликованному ответу.
arr = Array.new(1_00000){rand(1..200)}
puts Benchmark.measure{arr.select(&:odd?).sum}
0.000000 0.000000 0.000000 ( 0.005207)
puts Benchmark.measure{arr.sum{|n|n.odd? ? n : 0}}
0.000000 0.000000 0.000000 ( 0.006952)