अपरिवर्तनीय का क्या अर्थ है?


103

यदि एक स्ट्रिंग अपरिवर्तनीय है, तो क्या इसका मतलब यह है कि .... (मान लें कि जावास्क्रिप्ट)

var str = 'foo';

alert(str.substr(1)); // oo

alert(str); // foo

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

यदि स्ट्रिंग उत्परिवर्तनीय थी, तो क्या इसका मतलब यह है कि दूसरा alert()भी वापस आ जाएगा oo?

जवाबों:


104

इसका मतलब यह है कि एक बार जब आप ऑब्जेक्ट को तुरंत बदल देते हैं, तो आप इसके गुणों को नहीं बदल सकते। अपने पहले अलर्ट में आप फू को नहीं बदल रहे हैं। आप एक नया स्ट्रिंग बना रहे हैं। यही कारण है कि आपके दूसरे अलर्ट में यह ऊ के बजाय "फू" दिखाएगा।

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

हाँ। एक बार बनने के बाद कुछ भी नहीं बदल सकता है। अब इसका मतलब यह नहीं है कि आप strचर के लिए एक नया स्ट्रिंग ऑब्जेक्ट असाइन नहीं कर सकते । आप बस वर्तमान वस्तु को बदल नहीं सकते हैं जो संदर्भ देता है।

यदि स्ट्रिंग उत्परिवर्तनीय थी, तो क्या इसका अर्थ है कि 2 चेतावनी () ओओ के रूप में अच्छी तरह से वापस आ जाएगी?

तकनीकी रूप से, नहीं, क्योंकि प्रतिस्थापन विधि एक नया स्ट्रिंग लौटाती है। एक वस्तु को परिवर्तनशील बनाना, विधि को नहीं बदलेगा। इसे बदलने योग्य बनाने का अर्थ है कि तकनीकी रूप से, आप इसे बना सकते हैं ताकि एक नया बनाने के बजाय मूल स्ट्रिंग को बदलेगा।


एक ही स्ट्रिंग यदि संशोधित और असाइन की गई है, तो स्ट्रिंग स्ट्रिंग str = 'foo' को अपडेट करेगी; str = str.substr (1)); // oo अलर्ट (str); // ऊ
अश्विन जी

कोड के बारे में क्या। स्ट्रिंग मान अब बदल गया है। var का नाम = "संतोष"; console.log (name.substr (0,2)); var नाम = "कुमार" कंसोल.लॉग (नाम); यह कैसे अभी भी अपरिवर्तनीय है
संतोष 12

97

निचले स्तर पर, अपरिवर्तनीयता का मतलब है कि मेमोरी को स्ट्रिंग में संग्रहीत किया जाता है, संशोधित नहीं किया जाएगा। एक बार जब आप एक स्ट्रिंग बनाते हैं "foo", तो मूल्य को संग्रहीत करने के लिए कुछ मेमोरी आवंटित की जाती है "foo"। इस मेमोरी को बदला नहीं जाएगा। यदि आप स्ट्रिंग को संशोधित करते हैं, तो कहते हैं, substr(1)एक नया स्ट्रिंग बनाया गया है और मेमोरी का एक अलग हिस्सा आवंटित किया जाता है जो स्टोर करेगा "oo"। अब आपके पास मेमोरी में दो स्ट्रिंग्स हैं, "foo"और "oo"। यहां तक ​​कि अगर आप "foo"अब और उपयोग नहीं करने जा रहे हैं, तो यह तब तक चारों ओर चिपक जाएगा जब तक कि यह कचरा एकत्र नहीं हो जाता।

एक कारण है कि स्ट्रिंग ऑपरेशन तुलनात्मक रूप से महंगे हैं।


1
नंबर अपरिवर्तनीय भी हैं।
आरएन कुशवाहा

3
2015 से नमस्ते !! "निचले स्तर पर, अपरिवर्तनीयता का अर्थ है कि मेमोरी को स्ट्रिंग में संग्रहीत किया जाता है, संशोधित नहीं किया जाएगा।" --- यह बहुत अधिक प्रतिबंधात्मक है और सही नहीं लगता है। अपरिहार्यता केवल उपयोगकर्ता क्षेत्र के बारे में है, जैसे ही भाषा विनिर्देशन अपरिवर्तनीय रखे जाते हैं, मेमोरी मेमोरी को पसंद के रूप में वर्चुअल मेमोरी को बदला जा सकता है।
झटके

2
यह उत्तर अकसेप्टेड उत्तर की तुलना में अधिक तार्किक है।
एजाज करीम

लेकिन मैं var str = 'foo' की तरह कर सकता हूं; मैं str = 'बार' के माध्यम से संशोधित कर सकता हूं। str value इस तरह से संशोधित हुई?
हैकर

@ हैकर नोप। आपने चर को एक नया स्ट्रिंग दिया है जो मेमोरी में एक नए स्थान की ओर इशारा करता है।
छल

13

अपरिवर्तनीय का अर्थ है, जिसे बदला या संशोधित नहीं किया जा सकता है।

इसलिए जब आप एक स्ट्रिंग को एक मूल्य प्रदान करते हैं, तो यह मान खरोंच से बनाया जाता है क्योंकि इसे प्रतिस्थापित किया जा रहा है। इसलिए हर बार एक नया मान उसी स्ट्रिंग को सौंपा जाता है, एक कॉपी बनाई जाती है। इसलिए वास्तव में, आप कभी भी मूल मूल्य नहीं बदल रहे हैं।


9

मैं जावास्क्रिप्ट के बारे में निश्चित नहीं हूं, लेकिन जावा में, स्ट्रिंग्स अपरिवर्तनीयता के लिए एक अतिरिक्त कदम उठाता है, "स्ट्रिंग कॉन्स्टेंट पूल" के साथ। स्ट्रिंग स्ट्रिंग शाब्दिक ( "foo") के साथ या एक Stringक्लास कंस्ट्रक्टर के साथ निर्माण किया जा सकता है । स्ट्रिंग लिटरल्स के साथ निर्मित स्ट्रिंग्स, लगातार कॉन्स्टेंट पूल का एक हिस्सा हैं, और एक ही स्ट्रिंग शाब्दिक हमेशा पूल से एक ही मेमोरी एड्रेस होगा।

उदाहरण:

    String lit1 = "foo";
    String lit2 = "foo";
    String cons = new String("foo");

    System.out.println(lit1 == lit2);      // true
    System.out.println(lit1 == cons);      // false

    System.out.println(lit1.equals(cons)); // true

ऊपर, दोनों में lit1और lit2एक ही स्ट्रिंग शाब्दिक का उपयोग करके बनाया गया है, इसलिए वे एक ही मेमोरी पते पर इंगित कर रहे हैं; lit1 == lit2में परिणाम true, क्योंकि वे वास्तव में एक ही वस्तु हैं।

हालांकि, consक्लास कंस्ट्रक्टर का उपयोग करके बनाया गया है। हालांकि पैरामीटर एक ही स्ट्रिंग स्थिर है, निर्माता आबंटित करता है के लिए नए स्मृति cons, जिसका अर्थ है consनहीं के रूप में एक ही वस्तु है lit1और lit2एक ही डेटा युक्त होने के बावजूद।

बेशक, चूंकि तीन तारों में सभी समान वर्ण डेटा होते हैं, इसलिए equalsविधि का उपयोग करके यह सच हो जाएगा।

(दोनों प्रकार के स्ट्रिंग निर्माण अपरिवर्तनीय हैं, निश्चित रूप से)


3

अपरिवर्तनीय का मतलब है कि मूल्य को बदला नहीं जा सकता है। एक बार बनाए जाने के बाद एक स्ट्रिंग ऑब्जेक्ट को अपरिवर्तनीय रूप में संशोधित नहीं किया जा सकता है। यदि आप एक स्ट्रिंग के विकल्प का अनुरोध करते हैं तो अनुरोधित भाग के साथ एक नया स्ट्रिंग बनाया जाता है।

स्ट्रिंग के हेरफेर करते समय स्ट्रिंगर बफ़र का उपयोग करने के बजाय ऑपरेशन को और अधिक कुशल बनाता है क्योंकि स्ट्रिंग स्ट्रिंगर चरित्र चरित्र की क्षमता और सरणी की लंबाई को धारण करने के लिए चर के साथ एक चरित्र सरणी में स्ट्रिंग को संग्रहीत करता है (स्ट्रिंग एक चार सरणी रूप में स्ट्रिंग)


3

परिवर्तनशीलता की पाठ्य-पुस्तक की परिभाषा उत्तरदायी या परिवर्तन या परिवर्तन के अधीन है। प्रोग्रामिंग में, हम शब्द का उपयोग उन वस्तुओं से करते हैं जिनकी स्थिति को समय के साथ बदलने की अनुमति है। एक अपरिवर्तनीय मूल्य इसके ठीक विपरीत है - इसे बनाए जाने के बाद, यह कभी नहीं बदल सकता है।

यदि यह अजीब लगता है, तो मुझे आपको याद दिलाने की अनुमति दें कि हम हर समय जिन मूल्यों का उपयोग करते हैं, वे वास्तव में अपरिवर्तनीय हैं।

var statement = "I am an immutable value";
var otherStr = statement.slice(8, 17);

मुझे लगता है कि कोई भी यह जानकर आश्चर्यचकित नहीं होगा कि दूसरी पंक्ति किसी भी तरह से बयान में स्ट्रिंग को नहीं बदलती है। वास्तव में, कोई भी स्ट्रिंग विधि उस स्ट्रिंग को नहीं बदलती है जिस पर वे काम करते हैं, वे सभी नए तार लौटाते हैं। कारण यह है कि तार अपरिवर्तनीय हैं - वे बदल नहीं सकते, हम केवल कभी भी नए तार बना सकते हैं।

स्ट्रिंग्स जावास्क्रिप्ट में निर्मित एकमात्र अपरिवर्तनीय मूल्य नहीं हैं। नंबर अपरिवर्तनीय भी हैं। क्या आप ऐसे वातावरण की भी कल्पना कर सकते हैं जहाँ अभिव्यक्ति 2 + 3 का मूल्यांकन करने से संख्या 2 का अर्थ बदल जाए? यह बेतुका लगता है, फिर भी हम हर समय अपनी वस्तुओं और सरणियों के साथ ऐसा करते हैं।


2

तार से ढेर करने के लिए ... एक सरल उदाहरण से लिया समझने के लिए एरिक Lippert के ब्लॉग :

C # 3.0, भाग दो में A * का प्रयोग करते हुए पाथ फाइंडिंग ...

System.Collections.Generic.Stack जैसे एक परिवर्तनशील स्टैक स्पष्ट रूप से उपयुक्त नहीं है। हम एक मौजूदा रास्ता लेना चाहते हैं और इसके अंतिम तत्व के सभी पड़ोसियों के लिए इसमें से नए रास्ते बनाना चाहते हैं, लेकिन मानक स्टैक पर एक नए नोड को धकेलना स्टैक को संशोधित करता है। हमें इसे धकेलने से पहले स्टैक की प्रतियां बनानी होंगी, जो कि मूर्खतापूर्ण है क्योंकि तब हम इसकी सभी सामग्रियों को अनावश्यक रूप से डुप्लिकेट कर रहे होंगे।

अपरिवर्तनीय स्टैक्स में यह समस्या नहीं है। एक अपरिवर्तनीय स्टैक पर धक्का देने से केवल एक नया स्टैक बनता है जो अपनी पूंछ के रूप में पुराने को जोड़ता है। चूंकि स्टैक अपरिवर्तनीय है, इसलिए कुछ अन्य कोड के साथ आने और पूंछ की सामग्री के साथ खिलवाड़ करने का कोई खतरा नहीं है। आप अपने दिल की सामग्री के लिए पुराने स्टैक का उपयोग कर सकते हैं।

अंडरकस्टिंग अपरिवर्तनीयता पर गहराई से जाने के लिए, एरिक के पदों को इस एक से शुरू करें:

सी # पार्ट वन में इम्युनिटी


उस उद्धरण में एक अजीब दावा है - वह स्टैक डेटा संरचना (वास्तव में टेल-शेयरिंग के साथ कई ढेर), एक पूरे के रूप में, एक परिवर्तनशील संरचना है - हर धक्का या पॉप संरचना को बदलता है। केवल व्यक्तिगत आइटम अपरिवर्तनीय हैं। और सिद्धांत रूप में, आपके पास एक ही संरचना हो सकती है लेकिन परस्पर तत्वों के साथ। यह पूर्ववत मिल IIRC के कुछ भिन्नरूपों में होता है। अपरिपक्वता के बड़े फायदे हैं, लेकिन एक अनुकूलन के रूप में एक डेटा संरचना का हिस्सा या सभी साझा करना उत्परिवर्तनों के साथ पूरी तरह से संभव है। यहां तक ​​कि अगर आप अन्य संदर्भों के लिए स्पष्ट अपरिवर्तनीयता चाहते हैं, तो आप हमेशा आवश्यकतानुसार कॉपी-ऑन-राइट लिख सकते हैं।
स्टीव ३१४

0

इस अवधारणा को समझने का एक तरीका यह है कि कैसे जावास्क्रिप्ट सभी वस्तुओं का व्यवहार करता है, जो कि संदर्भ से है। तात्पर्य यह है कि सभी वस्तुओं को तात्कालिक होने के बाद परस्पर जोड़ा जाता है, इसका मतलब है कि आप नए तरीकों और गुणों के साथ एक वस्तु जोड़ सकते हैं। यह मायने रखता है क्योंकि अगर आप चाहते हैं कि कोई वस्तु अपरिवर्तनीय हो, तो वस्तु तत्कालिक होने के बाद बदल नहीं सकती है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.