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циклу використання .
Дарт Егрегійний

@DarthEgrevable чому це?
Дуг

Це розширення філософії, що кожна річ є об'єктом, і кожна дія є викликом методу. Тому замість того, щоб використовувати вбудований цикл для роботи for, слід скористатися eachметодом.
Дарт Егрегійний

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

Ітератується над rng, передаючи кожен n-й елемент до блоку. Якщо діапазон містить числа або рядки, використовується природне впорядкування. В іншому випадку крок викликає успіх ітерації через елементи діапазону. У наступному коді використовується клас 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.