2014-11-17 14 views
5

Tôi nghĩ rằng điều tra vô hạn là rất thuận tiện cho việc viết các tập lệnh kiểu FP nhưng tôi vẫn chưa tìm được cách thoải mái để xây dựng cấu trúc như vậy trong Ruby.Cách nhanh nhất để diễn tả điều tra vô hạn `(1.Inf)` trong Ruby là gì?

Tôi biết tôi có thể xây dựng nó một cách rõ ràng:

a = Enumerator.new do |y| 
    i = 0 
    loop do 
     y << i += 1 
    end 
end 
a.next #=> 1 
a.next #=> 2 
a.next #=> 3 
... 

nhưng đó là annoyingly dài dòng cho một cấu trúc đơn giản như vậy.

Một cách khác là sắp xếp của một "hack" của việc sử dụng Float::INFINITY:

b = (1..Float::INFINITY).each 
b = (1..1.0/0.0).each 

Hai có lẽ là giải pháp vụng về nhất tôi có thể cung cấp. Mặc dù tôi muốn biết nếu có một số cách khác thanh lịch hơn để xây dựng các điều tra vô hạn. (Nhân tiện, tại sao Ruby không chỉ làm cho inf hoặc infinity như một chữ cho Float::INFINITY?)

Trả lời

2

Sử dụng #to_enum hoặc #lazy để chuyển đổi của bạn Range một Enumerable. Ví dụ:

(1..Float::INFINITY).to_enum 
(1..Float::INFINITY).lazy 
+0

Cảm ơn. Tôi không biết về 'lười biếng'. Dường như là một cách tuyệt vời để bắt chước các nguyên tắc FP tốt hơn. – trVoldemort

1

Cá nhân tôi sẽ tạo lớp Ruby cho riêng mình.

class NaturalNumbers 
    def self.each 
    i = 0 
    loop { yield i += 1 } 
    end 
end 

NaturalNumbers.each do |i| 
    puts i 
end 
+0

Nếu tôi muốn 'def f (n); (1..1.0/0) .each_with_object ([]) {| i, a | một << i; trả về nếu i * i == n}; kết thúc'? Tôi nghĩ rằng bạn cần phải trả lại một điều tra viên nếu không có khối. –

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