2013-03-30 42 views
12

tôi có thể lặp như thế nàyLàm thế nào tôi có thể lặp qua một phạm vi đảo ngược với một bước cụ thể trong Ruby?

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

nhưng, vì phạm vi đảo ngược bằng khoảng trống, tôi không thể lặp theo cách này

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

nó sẽ kiếm được cho tôi không có gì. Tất nhiên, tôi có thể lặp lạc hậu như thế này

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

nhưng downto phương pháp không cho phép tôi để thiết lập bước khác, ngoại trừ mặc định 1. Đó là một cái gì đó rất cơ bản, vì vậy tôi cho rằng cần có một cách tích hợp để làm điều này, mà tôi không biết.

+0

bạn có thể làm một cái gì đó như '(0..10) .step (2) .reverse' nhưng bạn có thể cần phải thêm một số logic trong trường hợp được cho là đầu ra từ '(10..0) .step (2)' là khác nhau. – jvnill

+0

'(0..10) .step (2) .reverse' không hợp lệ; Ruby nói: 'NoMethodError: phương thức undefined 'reverse' cho # '. –

Trả lời

20

Tại sao bạn không sử dụng Numeric#step:

Từ các tài liệu:

Invokes block with the sequence of numbers starting at num, incremented by step (default 1) on each call. The loop finishes when the value to be passed to the block is greater than limit (if step is positive) or less than limit (if step is negative). If all the arguments are integers, the loop operates using an integer counter. If any of the arguments are floating point numbers, all are converted to floats, and the loop is executed floor(n + n*epsilon)+ 1 times, where n = (limit - num)/step. Otherwise, the loop starts at num, uses either the < or > operator to compare the counter against limit, and increments itself using the + operator.

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

Rất tốt. Ngoài ra tôi tìm thấy một cách khác, ít thanh lịch hơn mặc dù: (-10..0) .step (2) {| v | đặt -1 * v} – user1887348

4

rất dễ dàng để mô phỏng step bằng cách bỏ qua các giá trị bạn không cần. Một cái gì đó như thế này:

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

Nếu bạn có điều kiện bỏ qua các phần tử trong mỗi câu lệnh mà bạn đang làm sai, và nên sử dụng lựa chọn: '10.downto (0) .select.with_index {| x, idx | idx% 3 == 0} .each {| x | đặt x} ' – SamStephens

+0

@SamStephens: điều này có thể gây tranh cãi. –

+0

Mọi thứ đều có, nhưng tôi sẽ khẳng định rằng nếu bạn định sử dụng các tính năng dựa trên bộ sưu tập chức năng của Ruby, bạn nên sử dụng chúng một cách nhất quán, thay vì trộn các kiểu chức năng và bắt buộc. – SamStephens

Các vấn đề liên quan