2010-05-28 9 views
14

Tôi đang cố gắng giải quyết vấn đề Project Euler bằng Ruby, tôi đã sử dụng 4 phương thức lặp khác nhau, phương thức for-loop, times, range và upto. câu trả lời mong đợi, trong khi phương thức for-loop, range và upto thì không. Tôi giả định rằng họ có phần giống nhau, nhưng tôi phát hiện ra là không. Ai đó có thể vui lòng giải thích sự khác biệt giữa các phương pháp này?Sự khác biệt về vòng lặp trong Ruby khi sử dụng Range so với Times

Dưới đây là cấu trúc vòng lặp tôi đã sử dụng

# for-loop method 
for n in 0..1 
    puts n 
end 

0 
1 
=> 0..1 

# times method 
2.times do |n| 
    puts n 
end 

0 
1 
=> 2 

# range method 
(0..1).each do |n| 
    puts n 
end 

0 
1 
=> 0..1 

# upto method 
0.upto(1) do |n| 
    puts n 
end 

0 
1 
=> 0 

Trả lời

6

Thông tin này có thể dễ dàng thu được bằng cách kiểm tra các tài liệu hướng dẫn.

Array#each có chữ ký array.each {|item| block } → array, vì vậy chúng tôi có thể thấy rằng giá trị trả lại là foo.each { ... }foo.

Tương tự, Int#upto có chữ ký int.upto(limit) {|i| block } => int, để x.upto(y) { ... } sẽ luôn trả lại x.

Sau đó, chúng tôi cũng có thể thấy rằng 2.times { ... } sẽ trả về 2 vì chữ ký của Integer#times.

Tôi đang gặp khó khăn trong việc tìm tài liệu phù hợp, nhưng for x in y... được dịch sang y.each do |x| ..., vì vậy đó là lý do tại sao vòng lặp for-in của bạn trả về kết quả giống như vòng lặp .each của bạn.

Dù sao, tùy thuộc vào giá trị trả về của các cấu trúc vòng lặp này là ... một cách tiếp cận lạ. Tôi không nghĩ rằng điều này xảy ra nhiều (ở tất cả?) Trong mã Ruby thành ngữ.

+0

Nó không có vẻ như tôi đang hỏi về giá trị trả lại. – sepp2k

+0

@ sepp2k: Tôi thấy rằng * đầu ra * của mỗi câu lệnh là '0 1', trong khi các giá trị trả về như được chỉ ra bởi' => 'có 3 giá trị khác nhau. Câu hỏi có thể đã được diễn đạt rõ ràng hơn, trong mọi trường hợp. –

+0

Hm, có lẽ bạn đã đúng. – sepp2k

3

Nếu tôi hiểu chính xác bạn, bạn đang hỏi tại sao n.times là phương pháp duy nhất lặp lại tối đa, nhưng không bao gồm n. Trong trường hợp đó:

Đối với phạm vi đơn giản: x..y xác định phạm vi từ x đến y bao gồm và x...y xác định phạm vi từ x thành y độc quyền. Vì vậy, nếu bạn muốn cùng một hành vi như thời gian sử dụng 0...n.

Đối với x.upto(y) chỉ có một phiên bản sẽ lặp lại tối đa và bao gồm y. Đây chỉ đơn giản là cách xác định tối đa và được làm tài liệu.

Nó cũng khá rõ ràng lý do tại sao n.times không bao gồm n: nếu nó lặp lại từ 0 đến n (bao gồm), nó sẽ mang lại n+1 lần. Nhưng vì phương thức này được gọi là n.times, nên rõ ràng chỉ mang lại n lần.