2012-03-29 47 views
8

Giả sử tôi có mã C bên dướilàm thế nào để bỏ qua một vài lần lặp trong một vòng lặp trong Ruby?

for(i = 0; i < 10; i++){ 
    printf("Hello"); 
    if(i == 5){ 
     a[3] = a[2] * 2; 
     if(a[3] == b) 
      i = a[3];   //Skip to index = a[3]; depends on runtime value 
    } 
} 

Làm thế nào để chuyển đổi sang Ruby? Tôi biết chúng ta có thể bỏ qua một lần lặp bằng cách sử dụng next, nhưng tôi phải bỏ qua một vài lần lặp lại tùy thuộc vào giá trị có điều kiện và tôi không biết có bao nhiêu lần lặp để bỏ qua trước khi chạy?


Đây là mã tôi đang thực sự làm việc trên (như đã đề cập bởi Coreyward):

Tôi đang tìm kiếm "đường thẳng" trong mảng các giá trị khác ít hơn 0.1 (ít hơn 0.1 sẽ được coi là "đường thẳng"). Phạm vi phải dài hơn 50 được coi là một "dòng" dài. Sau khi tôi tìm thấy phạm vi dòng [a, b], tôi muốn bỏ qua các lần lặp đến giới hạn trên b để nó không bắt đầu lại từ +1, và nó sẽ bắt đầu tìm "đường thẳng" mới từ b + 1

for(i=0; i<arr.Length; i++){ 
    if(arr[i] - arr[i + 50] < 0.1){ 
    m = i;         //m is the starting point 
    for(j=i; j<arr.Length; j++){    //this loop makes sure all values differs less than 0.1 
     if(arr[i] - arr[j] < 0.1){ 
     n = j; 
     }else{ 
     break; 
     } 
    } 
    if(n - m > 50){       //Found a line with range greater than 50, and store the starting point to line array 
     line[i] = m 
    } 
    i = n          //Start new search from n 
    } 

}

+2

Nó sẽ là nhiều hơn nữa hữu ích nếu bạn cung cấp mục đích của những gì bạn đang cố gắng để đạt được. Có một số phương thức khá tiện dụng trong lớp Enumerator cho phép bạn thiết lập giá trị cho lần lặp tiếp theo ('feed') và xem giá trị tiếp theo (' peek'), và bạn cũng có thể sử dụng vòng lặp 'for' trong Ruby. Tôi chắc chắn có một cách viết sạch hơn này, tôi chỉ không biết nó đang cố gắng làm gì. – coreyward

+0

Bạn sẽ lập chỉ mục ở cuối mảng của bạn trong C, có thể muốn thay đổi giới hạn thành 'arr.Length-50'. Điều này có vẻ giống như một cách hơi phức tạp để tìm chạy của 50 hoặc nhiều hơn có giá trị là với epsilon của giá trị ban đầu. – dbenhur

+0

Bạn dường như giả định giá trị ở chỉ mục lớn hơn không bao giờ nhỏ hơn giá trị ở chỉ mục thấp hơn. Điều này có đúng không? – dbenhur

Trả lời

2

Một cách khác là sử dụng lớp enumerator:

iter = (1..10).to_enum 
while true 
    value = iter.next 
    puts "value is #{value.inspect}" 
    if value == 5 
    3.times {value = iter.next} 
    end 
end 

cho

value is 1 
value is 2 
value is 3 
value is 4 
value is 5 
value is 9 
value is 10 
StopIteration: iteration reached at end 
     from (irb):15:in `next' 
     from (irb):15 
     from C:/Ruby19/bin/irb:12:in `<main>' 
+0

Điều này thật dễ thương, nhưng không phải là tương đương để thăng tiến chỉ mục một cách trực tiếp. Nếu một người đang lặp qua một mảng với i và đạt đến một quyết định mà người ta muốn tiến tới chỉ mục j, làm '(j-i) .times {iter.next}' phức tạp hơn và tốn kém hơn là chỉ gán 'i = j' – dbenhur

3

trường hợp của bạn không dễ dàng bao phủ bởi lặp ruby ​​điển hình, nhưng ruby ​​cũng có bình thường trong khi vòng mà hoàn toàn có thể bù đắp c-cho. sau đây là tương đương với c của bạn cho vòng lặp ở trên.

i = 0; 
while i < 10 
    puts "Hello" 
    if i == 5 
    a[3] = a[2] * 2 
    i = a[3] if a[3] == b 
    end 
    # in your code above, the for increment i++ will execute after assigning new i, 
    # though the comment "Skip to index = a[3]" indicates that may not be your intent 
    i += 1 
end 
+0

Có điều này hoạt động, nhưng có cách nào để làm điều đó với Enumerators? Tôi đã suy nghĩ về 'thả' vì vậy nó sẽ thả các giá trị giữa 5 và [3], nhưng đã bối rối và bị mất khi tôi bắt đầu mã hóa. – texasbruce

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