2015-03-01 14 views
5

Tôi đã đọc walkthrough about sequences nhưng tôi không thực sự hiểu tại sao có một cách để xác định cả một Iterable theo nghĩa đen và một Chuỗi theo nghĩa đen.Tại sao bạn tạo một Iterable thay vì một Sequence trong Ceylon?

{String+} iterable = {"String1", "String2"}; 
[String+] sequence = ["String1", "String2"]; 

Vì trình tự là loại phụ có thể lặp lại, có vẻ như nó có thể thực hiện mọi thứ mà Iterable thực hiện và hơn thế nữa.

Cần có gì để có bộ khởi tạo dấu ngoặc nhọn lặp lại? Khi nào bạn muốn sử dụng nó thay vì phiên bản Khung hình vuông?

Trả lời

7

Luồng đang lười.

import ceylon.math.float {random} 

value rng = {random()}.cycled; 

Vì vậy, đó là một lười biếng, vô hạn dòng số ngẫu nhiên. Hàm random không được gọi khi bạn tạo luồng. Mặt khác, một chuỗi sẽ háo hức đánh giá các đối số của nó, trong trường hợp này cho bạn kết quả của một lời gọi đơn lẻ là random lặp đi lặp lại. Một ví dụ khác:

function prepend<Element>(Element first, {Element*} rest) => {first, *rest}; 

Ở đây, luồng rest được trải rộng trên luồng kết quả, nhưng chỉ theo yêu cầu.

5

Chính xác những gì @gdejohn nói, nhưng tôi muốn chỉ ra rằng sự lười biếng là đặc biệt quan trọng cho hiệu suất nếu bạn đang đi để áp dụng nhiều hoạt động để dòng, ví dụ:

value stream = { random() }.cycled 
     .filter((x) => x>0.5) 
     .map((x) => (x*100).integer); 
printAll(stream.take(1000)); 

Ở đây chúng ta tránh bao giờ materializing toàn bộ chuỗi có độ dài 1000, vì mỗi một hoạt động trung gian: cycled, filter(), map()take() trả về một luồng. Và thậm chí printAll() không cần phải thực hiện một chuỗi.

+0

Ngoài công cụ 'ngẫu nhiên()' được gọi nhiều lần (mà tôi đã không nhận ra cho đến bây giờ), cũng sẽ làm việc với '[...]', phải không? '[5] .cycled' sẽ vẫn trả về một vòng lặp lười biếng. –

+0

Có, '[5] .cycled' là lười biếng. Nó không cố gắng thực hiện một chuỗi vô hạn :-) –

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