Как я могу перебирать обратный диапазон с определенным шагом в Ruby?

Я могу повторить так:

(0..10).step(2){|v| puts v}

но, поскольку обратный диапазон равен пустому диапазону, я не могу перебирать этот путь

(10..0).step(2){|v| puts v}

он ничего не заработает. Конечно, я могу повторить эту попытку

10.downto(0){|v| puts v}

но метод downto не позволяет мне устанавливать другой шаг, кроме значения по умолчанию 1. Это что-то очень основное, поэтому я полагаю, что для этого должен быть встроенный способ, о котором я не знаю.

Ответ 1

Почему бы вам не использовать Numeric#step:

Из документов:

Вызывает блок с последовательностью чисел, начинающихся с num, с шагом в шаг (по умолчанию 1) для каждого вызова. Цикл заканчивается, когда значение, которое должно быть передано блоку, больше предела (если шаг положительный) или меньше предела (если шаг отрицательный). Если все аргументы являются целыми числами, цикл работает с использованием целочисленного счетчика. Если какой-либо из аргументов является числом с плавающей запятой, все преобразуются в float, а цикл исполняется наполом (n + n * epsilon) + 1 раз, где n = (limit-num)/step. В противном случае цикл начинается с num, использует либо < или > , чтобы сравнить счетчик с лимитом и прирастает с помощью оператора +.

irb(main):001:0> 10.step(0, -2) { |i| puts i }
10
8
6
4
2
0

Ответ 2

очень легко эмулировать step, пропуская значения, которые вам не нужны. Что-то вроде этого:

10.downto(0).each_with_index do |x, idx|
  next if idx % 3 != 0 # every third element
  puts x
end
# >> 10
# >> 7
# >> 4
# >> 1