Как сопоставить один массив с двумя в Ruby и выполнить некоторую функцию, если выполнено условие

#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