6

मैं स्कैला का मूल्यांकन कर रहा हूं और इसके अपरिवर्तनीय संग्रह में समस्या है।स्कैला के अपरिवर्तनीय संग्रहों को अपरिवर्तनीय वस्तुओं को कैसे बनाए रखें

मैं अपरिवर्तनीय संग्रह बनाना चाहता हूं, जो पूरी तरह से अपरिवर्तनीय हैं, सभी निहित वस्तुओं के माध्यम से नीचे, वस्तुओं को संदर्भित करते हैं, विज्ञापन infinitum।

क्या ऐसा करने का कोई आसान तरीका है?

http://www.finalcog.com/immutable-containers-scala पर कोड बताता है कि मैं क्या हासिल करने की कोशिश कर रहा हूं, और आस-पास के काम (ImmutablePoint)।

कामकाज के साथ समस्या यह है कि हर बार जब मैं किसी ऑब्जेक्ट को बदलना चाहता हूं तो मुझे मैन्युअल रूप से एक नई प्रतिलिपि बनाना होगा। मैं समझता हूं कि रनटाइम को कॉपी-ऑन-राइट लागू करना होगा, लेकिन क्या इसे डेवलपर को पारदर्शी बनाया जा सकता है?

मुझे लगता है कि मैं अपरिवर्तनीय ऑब्जेक्ट्स बनाना चाहता हूं, जहां विधियां वर्तमान ऑब्जेक्ट स्टेटस बदलती हैं, लेकिन ऑब्जेक्ट के सभी अन्य 'वैल' (और सभी अपरिवर्तनीय कंटेनर) संदर्भ 'पुराने' स्थिति को बनाए रखते हैं।

+0

यह पेपर आपको रूचि दे सकता है: http://lamp.epfl.ch/~phaller/capabilities.html –

+0

उत्कृष्ट पढ़ने सामग्री, धन्यवाद। – fadedbee

उत्तर

9

यह बाहर के बॉक्स स्केला के साथ कुछ विशिष्ट भाषा के माध्यम से निर्माण जब तक आप मुहावरा है कि अपने वस्तुओं के सभी अपरिवर्तनीय हैं, ऐसी स्थिति में इस व्यवहार मुक्त करने के लिए आता है का पालन किया है संभव नहीं है!

2.8 के साथ, नामित पैरामीटर ने "प्रतिलिपि बनाने वाले" को एक पठनीयता परिप्रेक्ष्य से उपयोग करने के लिए काफी अच्छा बना दिया है। लेकिन आप सही हैं, यह कॉपी-ऑन-राइट के रूप में काम करता है। जिस व्यवहार के लिए आप पूछ रहे हैं, जहां "वर्तमान" ऑब्जेक्ट एकमात्र एक उत्परिवर्तित है जो पूरी तरह से JVM काम करता है, दुर्भाग्य से (आपके लिए)!

दरअसल वाक्यांश "वर्तमान वस्तु" कोई समझ नहीं आता है; वास्तव में आपका मतलब है "वर्तमान संदर्भ"! अन्य सभी संदर्भ (वर्तमान शब्दावली के दायरे के बाहर) जो एक ही वस्तु को इंगित करता है, erm, उसी ऑब्जेक्ट को इंगित करता है! केवल एक ऑब्जेक्ट है!

इसलिए यह सिर्फ संभव नहीं है इस वस्तु के लिए मौजूदा शाब्दिक गुंजाइश के नजरिए से परिवर्तनशील लेकिन दूसरों

+0

आपके उत्तर के लिए धन्यवाद। हां, मेरा मतलब वर्तमान संदर्भ है। मुझे लगता है कि मैं वस्तु से क्या मतलब है पर थोड़ा ऊन रहा हूँ। यदि मैं एकाउंटिंग सिस्टम का सारण कर रहा हूं, उदाहरण के लिए, किसी खाते का प्रतिनिधित्व करने वाला ऑब्जेक्ट एक ऑब्जेक्ट है। हालांकि वस्तु कई राज्यों के माध्यम से हो सकती है। मैं अपरिवर्तनीय कंटेनर को 'राज्य' में ऑब्जेक्ट का संदर्भ देना चाहता हूं जिसमें यह कंटेनर में लगाए जाने पर मौजूद था। मेरे कामकाज में (केवल अपरिवर्तनीय वस्तुओं का उपयोग करके) खाते को एक सामान्य खाता_आईडी फ़ील्ड साझा करने वाली वस्तुओं की एक श्रृंखला द्वारा दर्शाया जाएगा। – fadedbee

+0

निष्कर्ष में, ऐसा लगता है कि मुझे अपरिवर्तनीय वस्तुओं का उपयोग सभी तरह से करना होगा। आपके समय के लिए धन्यवाद। – fadedbee

2

आप कैसे अपरिवर्तनीय को अपडेट प्रबंधित करने पर कुछ अधिक सामान्य सिद्धांत में रुचि रखते हैं के लिए अडिग होने के लिए प्रकट करने के लिए डाटा संरचनाओं कुशलतापूर्वक,

http://en.wikipedia.org/wiki/Zipper_%28data_structure%29

दिलचस्प साबित हो सकता है।

+0

धन्यवाद, यह दिलचस्प है।शायद मैं अपने अनिवार्य क्रश के बिना चल सकता हूं ... – fadedbee