Ruby: Làm thế nào để lặp lại trong một phạm vi, nhưng theo gia số đã đặt?


156

Vì vậy, tôi đang lặp đi lặp lại trong một phạm vi như vậy:

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

Nhưng những gì tôi muốn làm là lặp lại 10 giây.

Vì vậy, thay vì tăng n1, tiếp theo nsẽ là 10, rồi 20, 30, v.v.



@DiegoDias nhưng điều này có chủ đề tốt nhất và sau đó là chủ đề
Jackson Jegatheesan

Câu trả lời:


256

Xem http://ruby-doc.org/core/groupes/Range.html#M000695 để biết API đầy đủ.

Về cơ bản bạn sử dụng step()phương pháp. Ví dụ:

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

12
Câu trả lời này đã đưa tôi đến những gì tôi đang tìm kiếm ... Nếu bạn có hai lần, bạn có thể làm(time1..time2).step(15.minutes) do |time|
bẻ ngày

12

Bạn có thể sử dụng 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

Đây là một cách khác, có lẽ quen thuộc hơn để làm điều đó:

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

10
Xin lỗi, nhưng hướng dẫn phong cách ruby ​​không khuyến khích mạnh mẽ các forvòng lặp sử dụng .
Darth Egregious

@DarthEgregious tại sao vậy?
Doug

Đó là một phần mở rộng của triết lý rằng mọi thứ là một đối tượng và mọi hành động là một lời gọi phương thức. Vì vậy, thay vì sử dụng một tích hợp để lặp với for, bạn nên sử dụng eachphương thức này.
Darth Egregious

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

Lặp lại trên rng, chuyển từng phần tử thứ n cho khối. Nếu phạm vi chứa số hoặc chuỗi, thứ tự tự nhiên được sử dụng. Mặt khác, bước gọi succ để lặp qua các phần tử phạm vi. Đoạn mã sau sử dụng lớp X, được định nghĩa trong tài liệu cấp lớp.

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

sản xuất:

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

Tham khảo: http://ruby-doc.org/core/groupes/Range.html

......

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.