2011-12-27 35 views
5

Xem xét một Enumerator đơn giản như thế này:Tại sao Enumerator.new yêu cầu đối tượng "yielder"?

natural_numbers = Enumerator.new do |yielder| 
    number = 1 
    loop do 
    yielder.yield number 
    number += 1 
    end 
end 

Câu hỏi của tôi là: Tại sao ruby ​​yêu cầu chúng tôi gọi năng suất trên đối tượng yielder? Nói cách khác: Tại sao chúng ta không thể thay thế yielder.yield number bằng yield number? Trong ví dụ này, nó sẽ được xuất hiện để được điều tương tự, nếu nó được cho phép. Có những ví dụ mà yielder được sử dụng một cách không tầm thường? Nếu có, bạn có thể cho một cái không? Nếu không, mục đích của yielder là gì?

Cảm ơn.

Trả lời

3

Không chắc chắn 100% nếu đó là lý do, nhưng yield một mình (luôn luôn) áp dụng cho khối được gửi cho phương pháp gọi yield: trong trường hợp của bạn là phương pháp có chứa nhiệm vụ natural_numbers; và không thể thực hiện điều mong muốn cho Enumerator, tức là phát ra phần tử Đếm. Mặc dù mang cùng tên, Yielder#yield là một phương thức và số yield của Ruby là một câu lệnh.

Nói cách khác, sẽ không thể triển khai phương thức khởi tạo Enumerator sẽ hoạt động với câu lệnh yield.

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