2016-05-19 13 views
7

Một điều tra viên có thể được chuyển đổi thành một điều tra viên lười biếng sử dụng Enumerator::Lazy.new như thế này (đây là một ví dụ; ngay từ đầu, tôi đã có một Enumerator, không phải là một mảng):Chuyển đổi điều tra viên để điều tra viên lười biếng

xs_enum = [1, 2, 3].to_enum 
# => #<Enumerator: [1, 2, 3]:each> 
xs_lazy_enum = Enumerator::Lazy.new(xs_enum, &:yield) 
# => #<Enumerator::Lazy: #<Enumerator: [1, 2, 3]:each>:each> 
xs_lazy_enum.force 
# => [1, 2, 3] 

Liệu có một cách ngắn gọn hơn để làm điều đó?

Trả lời

4

gì về:

[1, 2, 3].to_enum.lazy 
# => #<Enumerator::Lazy: ...> 

Thật vậy, nhưng vấn đề là tôi bắt đầu từ một điều tra viên, chứ không phải từ một mảng

Điều đó không thay đổi bất cứ điều gì:

enum = (1..10).each 
# => #<Enumerator: ...> 
enum.lazy 
# => #<Enumerator::Lazy: ...> 

Enumerable#to_enum trả về một điều tra viên. Nếu bạn chuỗi cuộc gọi đến Enumerable#lazy, người nhận tin nhắn thứ hai là Người đếm ngược được trả về bằng cuộc gọi đầu tiên.

+1

Cảm ơn, có một số tính linh hoạt ở đây, đầu ra của đoạn mã và mỏ của bạn hơi khác: '=> # <Đếm :: Lazy: # <ĐTV: [1, 2, 3]: mỗi >> 'vs' # : each> '. Tôi sẽ thay đổi ví dụ trong câu hỏi. – tokland

+0

Bạn đã đúng! Cuối cùng sự khác biệt này không liên quan khi điều tra viên được sử dụng, do đó, một 'enum.lazy' đơn giản là con đường để đi. – tokland

+0

Câu trả lời rất hay cho một câu hỏi thú vị. Tại sao không chỉ bắt đầu câu trả lời của bạn với dòng 'enum = (1..10) .each'. –

7

Bạn có thể gọi trực tiếp lazy trên mảng (hoặc điều tra viên).

[1, 2, 3].lazy 
# => #<Enumerator::Lazy: [1, 2, 3]> 
+0

Câu trả lời đơn giản tuyệt vời! –

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