Tôi hiện đang học Scala bằng cách làm việc thông qua cuốn sách "Lập trình trong Scala". Cho đến nay, đã có lời giải thích tốt đẹp cho tất cả mọi thứ có vẻ lạ (từ góc nhìn của một lập trình viên Java), nhưng đây là một ví dụ sử dụng một Stream để tạo ra các dãy Fibonacci lá tôi loại bối rối:Làm thế nào là khuyết điểm của Stream :: được dịch ở Scala?
def fibFrom(a: Int, b: Int): Stream[Int] =
a #:: fibFrom(b, a + b)
Làm thế nào là xây dựng của luồng được thực hiện? Tất nhiên các nhà điều hành #::
là bằng cách nào đó chịu trách nhiệm về điều đó. Tôi hiểu rằng kể từ khi nó kết thúc vào :
, nó là kết hợp đúng, nhưng điều đó không giải thích việc tạo Luồng. Tôi đoán nó được ngầm dịch sang một nhà xây dựng bằng cách nào đó nhưng tôi không thấy tại sao và chính xác như thế nào.
Tôi đã tìm câu trả lời trong Predef.scala
và LowPriorityImplicits.scala
nhưng không may mắn cho đến thời điểm này.
Ai đó có thể khai sáng cho tôi không?
Cảm ơn, đúng vậy. Tôi quên rằng chuyển đổi tiềm ẩn cũng có thể được xác định trong đối tượng đồng hành của lớp cần được chuyển đổi. – rolve
Scaladoc có lẽ sẽ tự động bao gồm những người bạn đồng hành mã hóa cứng. – Debilski
Có thể chỉ ra những người khác mới đến Scala rằng nó không phải là _just_ rằng nó là đúng liên kết. Nó cũng là ConsWrapper thực hiện '# ::' như [call-by-name] (https://github.com/scala/scala/blob/v2.10.3/src/library/scala/collection/immutable/Stream. scala # L1042). tức là '⇒' trong' ConsWrapper (tl: ⇒ Stream [A]) 'sao cho bản dịch thành' immutable.this.Stream.consWrapper (fibFrom (b, a + b)). #: :(a) 'có nghĩa là 'fibFrom (b, a + b)' sẽ chỉ được gọi khi được truy cập. – nicerobot