Lặp lại một khối trong Ruby đủ đơn giản - nó kết thúc sạch sẽ và tiếp tục với phần còn lại của mã.Ruby Enumerator - Tại sao kết thúc với ngoại lệ?
Lặp lại với một điều tra viên, mặt khác, hơi khó hiểu hơn một chút. Nếu bạn gọi: mỗi một khối không có một khối, một số đếm được trả về để thay thế. : tiếp theo sau đó có thể được gọi trên Enumerator để nhận được mỗi giá trị lặp tiếp theo.
Và sau đó phần lẻ- khi lặp lại hoàn tất, thay vì Toán tử trả về số không, nó ném một ngoại lệ: "lần lặp đạt đến lúc kết thúc". Kết quả là nó thậm chí không trả về một giá trị.
Ví dụ:
test = [ 'test_value' ]
enumerator = test.each
enumerator.next
>> "test_value"
enumerator.next
>> StopIteration: iteration reached at end
là lý do cho điều này chỉ đơn giản là để giá trị bằng không có thể được trả lại bởi Enumerator? Câu trả lời xảy ra với tôi chỉ khi tôi đăng bài này (vì vậy tôi sẽ đăng nó vẫn còn), nhưng có vẻ như nó phải là trường hợp.
Nếu đúng như vậy, đây có phải là cách xử lý các vấn đề như vậy không? Có vẻ kỳ quặc khi sử dụng Ngoại lệ để xử lý mã thực chất về cơ bản thực hiện như mong đợi.
OCaml đi xa hơn nữa - giá trị băm nhỏ hơn của «hàm băm» ('List.assoc key hash') của Ruby sẽ đặt ra một ngoại lệ (' Not_found') nếu khóa không được biểu diễn. Nó thực sự khá hợp lý - điều "bình thường" bạn mong đợi khi bạn gọi ': next' là lấy giá trị tiếp theo. * Không * nhận được giá trị tiếp theo rõ ràng sau đó là một tình huống đặc biệt. – Amadan
@Amadan: 'hash.fetch (khóa)' sẽ tăng 'KeyError' nếu không tìm thấy khóa. –
Đối số thú vị Amadan - Tôi mua nó. – Asher