Ruby: Как перебрать диапазон, но с заданным шагом?


156

Итак, я перебираю диапазон так:

(1..100).each do |n|
    # n = 1
    # n = 2
    # n = 3
    # n = 4
    # n = 5
end

Но то, что я хотел бы сделать, это повторить к 10-м.

Таким образом, вместо увеличения nна 1 следующим nбудет 10, затем 20, 30 и т. Д.



@DiegoDias, но у этого есть лучшая и затем эта нить
Джексон Джегатисан

Ответы:


256

См. Http://ruby-doc.org/core/classes/Range.html#M000695 для полного API.

В основном вы используете step()метод. Например:

(10..100).step(10) do |n|
    # n = 10
    # n = 20
    # n = 30
    # ...
end

12
Этот ответ привел меня к тому, что я искал ... Если у вас есть два раза, вы можете сделать(time1..time2).step(15.minutes) do |time|
рассвет

12

Вы можете использовать Numeric#step.

0.step(30,5) do |num|
  puts "number is #{num}"
end
# >> number is 0
# >> number is 5
# >> number is 10
# >> number is 15
# >> number is 20
# >> number is 25
# >> number is 30

6

Вот еще один, возможно, более знакомый способ сделать это:

for i in (0..10).step(2) do
    puts i
end

10
Извините, но руководство по рубиновому стилю настоятельно не рекомендует использовать forциклы.
Дарт Эгредиус

@DarthEgregious, почему это?
Дуг

Это расширение философии, согласно которой каждая вещь является объектом, а каждое действие - вызовом метода. Таким образом, вместо использования встроенного цикла с циклом for, вы должны использовать eachметод.
Дарт Эгредиус

5
rng.step(n=1) {| obj | block } => rng

Итерирует по rng, передавая каждый n-й элемент в блок. Если диапазон содержит числа или строки, используется естественный порядок. В противном случае step вызывает succ для перебора элементов диапазона. В следующем коде используется класс Xs, который определен в документации уровня класса.

range = Xs.new(1)..Xs.new(10)
range.step(2) {|x| puts x}
range.step(3) {|x| puts x}

производит:

1 x
3 xxx
5 xxxxx
7 xxxxxxx
9 xxxxxxxxx
1 x
4 xxxx
7 xxxxxxx
10 xxxxxxxxxx

Ссылка: http://ruby-doc.org/core/classes/Range.html

......

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.