2010-07-09 47 views
6

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.

Trả lời

6

Bạn đúng là lý do để có thể trả lại giá trị hợp lệ của Điều tra viên là nil. Để trả lời câu hỏi của bạn cho dù điều này là điển hình, Python xử lý nó theo cách tương tự bằng cách sử dụng một ngoại lệ cũng được gọi là StopIteration.

>>> my_list = [1,2,3] 
>>> i = iter(my_list) 
>>> i.next() 
1 
>>> i.next() 
2 
>>> i.next() 
3 
>>> i.next() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
StopIteration 

Tất nhiên, phần lớn thời gian next không được gọi trực tiếp (each hay for vòng lặp được sử dụng thay vì) để cơ chế cơ bản này không được tiếp xúc thường xuyên.

+1

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

+1

@Amadan: 'hash.fetch (khóa)' sẽ tăng 'KeyError' nếu không tìm thấy khóa. –

+0

Đối số thú vị Amadan - Tôi mua nó. – Asher

3

Vâng, không phải là kết quả, khác với việc không có giá trị trả lại. Về cơ bản, nó giống như cố gắng truy cập một biến hoặc một vị trí trong bộ nhớ không có ở đó. Đây là lý do tại sao bạn muốn một ngoại lệ hơn là trả về một con số không. Có vẻ như bạn đã hiểu rằng :-)

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