2015-03-01 9 views
5

मैंने walkthrough about sequences पढ़ा है लेकिन मुझे वास्तव में समझ में नहीं आता है कि एक शाब्दिक Iterable और एक शाब्दिक अनुक्रम परिभाषित करने का एक तरीका क्यों है।सिलोन में अनुक्रम के बजाय आप एक इटरबल क्यों बनाएंगे?

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

अनुक्रम के बाद से Iterable की एक उप-प्रकार, ऐसा लगता है जैसे कि यह सब कुछ Iterable करता है और अधिक करने के लिए सक्षम होना चाहिए है।

तब Iterable घुंघराले ब्रेसिज़ प्रारंभकर्ता होने की क्या आवश्यकता है? स्क्वायर ब्रैकेट अनुक्रम संस्करण के बजाय आप इसका उपयोग कब करना चाहते हैं?

उत्तर

7

स्ट्रीम आलसी हैं।

import ceylon.math.float {random} 

value rng = {random()}.cycled; 

तो यह यादृच्छिक संख्याओं की आलसी, अनंत स्ट्रीम है। जब आप स्ट्रीम बनाते हैं तो फ़ंक्शन random लागू नहीं होता है। दूसरी तरफ, एक अनुक्रम आपके तर्कों का बेसब्री से मूल्यांकन करेगा, इस मामले में आपको random के एक ही आमंत्रण का परिणाम मिल रहा है। एक और उदाहरण:

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

यहाँ, धारा rest जिसके परिणामस्वरूप धारा में फैला हुआ है, लेकिन केवल मांग पर।

5

@gdejohn वास्तव में क्या कहा, लेकिन मैं कहना है कि आलस्य प्रदर्शन के लिए विशेष रूप से महत्वपूर्ण है चाहता हूँ आप धारा करने के लिए कई आपरेशनों लागू करने के लिए जा रहे हैं, उदाहरण के लिए:

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

यहाँ हम से बचें लंबाई 1000 के पूरे अनुक्रम को पूरा करने के बाद, मध्यवर्ती परिचालनों में से प्रत्येक: cycled, filter(), map(), और take() एक स्ट्रीम देता है। और यहां तक ​​कि printAll() को अनुक्रम को पूरा करने की आवश्यकता नहीं है।

+0

'यादृच्छिक()' सामान के अलावा कई बार कहा जाता है (जिसे अब तक मुझे एहसास नहीं हुआ), वही होगा [...] ', क्या यह नहीं होगा? '[5] .cycled' अभी भी एक आलसी पुनरावर्तनीय वापस आ जाएगा। –

+0

हां, '[5] .cycled' आलसी है। यह एक अनंत अनुक्रम को पूरा करने की कोशिश नहीं करता है :-) –

संबंधित मुद्दे