2015-03-26 20 views
5

Tôi đã đọc this question và nó khiến tôi nghĩ tại sao người ta muốn sử dụng vòng lặp while khi phương pháp làm lại có thể được sử dụng thay thế. Tôi không thể tìm thấy sự khác biệt nào giữa hai người. Tôi biết rằng phương thức làm lại sẽ chạy lại khối mã và rằng trong khi các vòng lặp sẽ chạy lại khối mã miễn là điều kiện là đúng. Ai đó có thể đưa ra một ví dụ về lý do tại sao bạn muốn sử dụng cái này hay cái kia?Phương thức redo của Ruby so với vòng lặp

Trả lời

3

Lệnh redo khởi động lại lặp hiện tại của một vòng lặp (mà không kiểm tra các điều kiện chấm dứt trong while hoặc tiến lặp trong for, ví dụ), bạn vẫn cần một vòng lặp của một số mô tả (ví dụ như một vòng lặp while).

Đó là bằng chứng là câu trả lời bạn liên kết đến, trong đó có:

nums = Array.new(5){[rand(1..9), rand(1..9)]} 
nums.each do |num1, num2| 
    print "What is #{num1} + #{num2}: " 
    redo unless gets.to_i == num1 + num2 
end 

Các .each cung cấp các cấu trúc vòng lặp đó và tất cả các redo làm là khởi động lại vòng lặp đó (mà không tiến tới nums phần tử tiếp theo) nếu bạn nhận được câu trả lời sai.

Bây giờ bạn có thể thực sự sử dụng một vòng lặp while đó như vòng lặp kiểm soát, tiến tới tiếp theo chỉ khi bạn nhận được nó phải:

nums = Array.new(5){[rand(1..9), rand(1..9)]} 
index = 0 
while index < 6 do 
    num1 = nums[index][0] 
    num2 = nums[index][1] 
    print "What is #{num1} + #{num2}: " 
    if gets.to_i == num1 + num2 then 
     index = index + 1 
    end 
end 

hoặc trong .each bản thân mà không redo:

nums = Array.new(5){[rand(1..9), rand(1..9)]} 
nums.each do |num1, num2| 
    answer = num1 + num2 + 1 
    while answer != num1 + num2 do 
     print "What is #{num1} + #{num2}: " 
     answer = gets.to_i 
    end 
end 

nhưng không ai trong số chúng thanh lịch như giải pháp redo, cung cấp một cách biểu cảm hơn để kiểm soát vòng lặp, phần mở rộng cho điều khiển thông thường bạn nhìn thấy bằng các ngôn ngữ khác, chẳng hạn như continue hoặc break.

+0

Câu trả lời hay. Bạn có biết nếu 'redo' được sử dụng rộng rãi không? Bạn có thường xuyên sử dụng nó không? Tôi chưa bao giờ có nhu cầu về nó, thích thay vì lặp lại với một điều tra viên hoặc vòng lặp cho đến khi tôi thoát ra, nhưng tôi chỉ là một người có sở thích, vì vậy có lẽ tôi đã xem xét một công cụ hữu ích. –

+0

@Cary, tôi không sử dụng nó _that_ thường nhưng tôi đã sử dụng nó, trong một trường hợp rất giống với mã đã cho. Khi lặp qua bộ sưu tập mà bạn không có quyền kiểm soát thông qua chỉ mục, đôi khi có thể khởi động lại thành phần bộ sưu tập hiện tại, nếu xảy ra sự cố tạm thời (như người dùng nhập dữ liệu sai). – paxdiablo

+0

@paxdiablo, cảm ơn rất nhiều vì câu trả lời rõ ràng này. – chell

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