#ruby #iterator #reduce #collect
Вопрос:
Я пытаюсь улучшить читаемость фрагмента кода, а также сделать его более кратким, если это возможно.
У меня есть массив, который необходимо повторить, и если какой-либо элемент соответствует некоторым критериям, я хочу его собрать, а также выполнить другую работу, т. Е. обновить баланс по мере выполнения итерации, если необходимо выполнить условие if
need_bananas = []
need_apples = []
balance = 10
array.each do |item|
if need_bananas?(item)
need_bananas << item
elsif need_apples?(item)
need_apples << item
end
balance -= item.amount
end
def need_bananas?(item)
balance >= item.amount
end
def need_apples?(item)
balance < item.amount
end
Это кажется слишком громоздким, и должен быть способ сделать его более кратким. У меня есть мысли об использовании reduce или partition и т. Д., Но я не могу остановиться на хорошем решении
Заранее спасибо
Комментарии:
1. Вы можете использовать map (для создания массивов need_banans / need_apples) и sum (для расчета баланса), чтобы сделать код более читаемым
2. Пожалуйста, опубликуйте некоторый контекстуальный код. В настоящее время это попахивает проблемой X/Y, когда вы априори решили, что какое-то решение решит вашу основную проблему, но неясно, о каких условиях вы говорите, о том, почему простых подсчетов или операций приращения/уменьшения недостаточно.
Ответ №1:
Это то, что будет работать на вас?
balance = 10
need_bananas, need_apples = array.partition do |item|
(balance -= item.amound) >= 0
end