यदि मैं toSeq
पर एक अपरिवर्तनीय Set
संग्रह पर कॉल करता हूं तो मुझे ArrayBuffer
मिलता है।स्कैला के ToSeq एक अपरिवर्तनीय सेट को एक परिवर्तनीय ArrayBuffer में क्यों परिवर्तित करता है?
scala> Set(1,2,3).toSeq // returns Seq[Int] = ArrayBuffer(1, 2, 3)
यह मुझे आश्चर्यचकित करता है। अपरिवर्तनीय डेटा संरचनाओं का उपयोग करने पर स्कैला के जोर को देखते हुए, मैं एक म्यूटेबल ArrayBuffer
के बजाय Vector
या List
जैसे अपरिवर्तनीय अनुक्रम को वापस पाने की अपेक्षा करता हूं। सेट तत्वों का लौटा आदेश निश्चित रूप से अनिर्धारित होना चाहिए, लेकिन ऐसा कोई अर्थपूर्ण कारण प्रतीत नहीं होता है कि यह आदेश भी उत्परिवर्तनीय होना चाहिए।
आम तौर पर, मैं अपेक्षा करता हूं कि स्कैला परिचालन हमेशा अपरिवर्तनीय नतीजों का उत्पादन न करें जब तक कि मैं स्पष्ट रूप से एक उत्परिवर्ती अनुरोध नहीं करता। यह सब मेरी धारणा है, लेकिन यह यहां एक गलत है, और मैंने वास्तव में एक समस्या को डीबग करने में एक घंटे बिताया जहां ArrayBuffer
की अप्रत्याशित उपस्थिति ने match
कथन में रनटाइम त्रुटि उत्पन्न की। मेरा फिक्स Set(...).toSeq
को Set(...).toList
में बदलना था, लेकिन यह एक हैक जैसा लगता है क्योंकि मेरे आवेदन के बारे में कुछ भी नहीं है जिसके लिए विशेष रूप से उस सूची की आवश्यकता होती है।
Set(...).toSeq
एक उत्परिवर्तनीय वस्तु को स्कैला के कार्यान्वयन में एक दोष लौटाता है, या क्या कोई सिद्धांत है जो मैं यहां गलत समझ रहा हूं?
यह स्कैला 2.9.2 है।
2,10-RC2 में फिक्स्ड: 'स्केला> Seq (1,2,3) .toSeq' ->' res0: Seq [इंट] = सूची (1, 2, 3) ' – senia
@senia, क्या आपका मतलब' सेक (1,2,3) .toSq' के बजाय 'सेट (1,2,3) .toSeq' था? –
कृपया परिवर्तन के लिए वोट दें: [एसआई -6570] (https://issues.scala-lang.org/browse/SI-6570) –