Есть ли способ выполнить if-else с помощью collect in ruby и обновить массив - PullRequest
0 голосов
/ 26 февраля 2020
$days = 25
action_count = [0,0,0]

if $days < 0 
  action_count[0] += 1
elsif $days <= 20
  action_count[1] += 1
else
  action_count[2] += 1
end

Может ли этот код if-else быть сокращен с использованием функции сбора в ruby

1 Ответ

4 голосов
/ 26 февраля 2020

Я не могу придумать, как сделать это, используя collect, но вы можете использовать Enumerable#bsearch_index.

Если $days является целым числом, это делает то же самое, что и ваш if; но это не очень читабельно. (Целое число, поскольку существует небольшая проблема, связанная с тем, что вы используете два разных сравнения, и я предполагаю, что $days <= 20 совпадает с $days < 21).

action_count[[0, 21].bsearch_index { |x| $days < x } || -1] += 1

bsearch_index определяет, является ли $days меньше 0, 21 или ни того, ни другого, возвращая 0, 1 или nil. Мы заменяем случай nil на -1 (последний элемент), и у нас есть индекс, который мы можем использовать для увеличения соответствующего элемента action_count.

...