Thông thường nếu bạn tạo một đối tượng Stream
, người đứng đầu sẽ được háo hức đánh giá:Khi nào thì đầu của luồng được đánh giá?
scala> Stream({println("evaluating 1"); 1} , 2, 3)
evaluating 1
res63: scala.collection.immutable.Stream[Int] = Stream(1, ?)
Nếu chúng ta tạo ra một Stream mà chúng ta thêm vào trước trong báo cáo kết quả tương tự, có vẻ như hơi ngạc nhiên khi người đứng đầu không được đánh giá trước khi kết nối. ví dụ:
scala> 0 #:: Stream({println("evaluating 1"); 1} , 2, 3)
res65: scala.collection.immutable.Stream[Int] = Stream(0, ?)
(#::
là phải kết hợp và là phương pháp thêm vào trước trên ConsWrapper
, mà là một lớp tiềm ẩn của Stream
.)
Làm thế nào thực hiện điều này không đánh giá người đứng đầu của nó trước khi thêm vào trước 0? Có phải là Stream Stream (hoặc cons cells) không tồn tại trên heap cho đến khi chúng ta lấy các giá trị từ Stream resultant? Nhưng nếu vậy, làm cách nào chúng ta gọi phương thức #::
trên một đối tượng chưa tồn tại?
Tôi khuyên bạn nên sử dụng 'javap' để hiểu điều gì đang diễn ra. –
Tôi đã tìm ra nguồn (giả sử câu trả lời của tôi là chính xác) –