किसी फ़ंक्शन / विधि का वर्णन करने के लिए उपयोग किया जाने वाला शब्द क्या है जो उस वस्तु को संशोधित करता है जिसे वह कहा जाता है?


12

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

मेरा एक दोस्त प्रोग्रामिंग सीख रहा है, विशेष रूप से जावास्क्रिप्ट, और उसने मुझसे पूछा कि यह काम क्यों नहीं कर रहा है:

var a = "Hello World";
a.replace("Hello", "Goodbye");

console.log(a)  // Logs "Hello World"

इसका कारण यह replaceहै कि संशोधित नहीं होता है a, क्योंकि स्ट्रिंग JavaSript में अपरिवर्तनीय हैं। Becuase यह एक स्ट्रिंग देता है, आपको कुछ ऐसा करने की आवश्यकता होगी ...

var a = "Hello World";
a = a.replace("Hello", "Goodbye");

console.log(a);  // Logs "Goodbye World"

हालाँकि, विकल्प जावास्क्रिप्ट की तरह एक फ़ंक्शन है reverse(), क्योंकि यह जो भी कहता है उसे संशोधित करता है। उदाहरण के लिए:

var fruits = ["Apples", "Oranges", "Bananas"];
fruits.reverse();

console.log(fruits)  // ["Bananas", "Oranges", "Apples"]

जब मेरे दोस्त ने मुझसे पूछा कि उसका replaceकाम क्यों नहीं हो रहा है, तो मैंने महसूस किया कि मैं एक ऐसे शब्द के लिए पहुँच रहा हूँ जो मुझे नहीं पता (जहाँ तक मैं जानता हूँ) ...

"आपको स्ट्रिंग को" स्ट्रिंग डॉट रिप्लेस " पर सेट करना होगा, क्योंकि रिप्लेस फंक्शन ________ है।"

आपको "सरणी डॉट रिवर्स" के बराबर एक सरणी सेट करने की आवश्यकता नहीं है , क्योंकि रिवर्स ________ है। "

मैं प्रोटोटाइप फ़ंक्शंस से परिचित हूं, हालांकि मुझे विश्वास नहीं है कि मैं जिस शब्द की तलाश कर रहा हूं। क्या कोई मुझे इन रिक्त स्थानों को भरने में मदद कर सकता है?


6
शायद शब्द "म्यूटेटर" है? के रूप में: You don't need to set an array equal to "array dot reverse", because reverse is a mutator function। मुझे लगता है कि मैंने उस शब्दावली को उन कार्यों के संदर्भ में सुना है जो उस उदाहरण को "म्यूट" करते हैं जो उन्हें कॉल करता है। लेकिन आपको शायद कहीं और जांच करनी चाहिए।
FrustratedWithFormsDesigner

इसकी प्रशंसा करना! मैंने सिर्फ Mutator Methods पर कुछ रीडिंग की और मुझे लगता है कि यह निश्चित रूप से इस बातचीत में काफी फिट बैठता है। निश्चित रूप से जो मैं देख रहा हूं उसके दायरे में हूं।
सैंटी

मैं उलझन में हूँ: शीर्षक में, आप एक समारोह के बारे में पूछना है कि संशोधित उद्देश्य यह है कि यह कहा जाता है, लेकिन अपने उदाहरण में, आप तरीकों वस्तु वे कहा जाता है को संशोधित कि दिखाने पर , यानी शीर्षक के ठीक विपरीत। दोनों में से कौन सा है?
जोर्ग डब्ल्यू मित्तग

अच्छी तरह से निश्चित रूप से विस्तार से 30 लाइनों में समझाया गया है। मैं शीर्षक को सही होने के लिए संशोधित करूंगा, शीर्षकों के लिए धन्यवाद!
संटी

जवाबों:


12

जिन अवधारणाओं की जोड़ी आप देख रहे हैं, वे परस्पर / अपरिवर्तनीय मापदंडों और इन-प्लेस / परिणामों की वापसी हैं।

आपके उदाहरणों में:

आपको स्ट्रिंग को "स्ट्रिंग डॉट रिप्लेस" पर सेट करना होगा, क्योंकि रिप्लेस फंक्शन एक स्ट्रिंग पर संचालित होता है, जो कि अजगर में होता है, इसलिए यह अपरिवर्तनीय होता है, इसलिए रिप्लेस फंक्शन एक नया स्ट्रिंग लौटाता है।

C / C ++ प्रोग्रामर के लिए यह "संदर्भ द्वारा पारित" के बजाय "मान द्वारा पारित" पैरामीटर के रूप में अधिक परिचित है, जो उन्हें अपरिवर्तनीय बनाता है और परिणाम लौटाता है।

आपको "सरणी डॉट रिवर्स" के बराबर एक सरणी सेट करने की आवश्यकता नहीं है, क्योंकि रिवर्स एक सरणी पर संचालित होता है, जो कि परिवर्तनशील है , इसलिए लौटने से पहले इन-प्लेस में परिवर्तन करने में सक्षम है ।

C / C ++ जैसी भाषाओं में इसे "संदर्भ द्वारा पारित" अर्थात पते से गुजरने वाले पैरामीटर के रूप में जाना जाता है, जो कि यदि असंबद्ध है const, तो फ़ंक्शन को बदलने की अनुमति देता है, म्यूट करता है , उस पते की सामग्री लौटने से पहले इन-प्लेस को बदल देती है ।

बेशक यह असामान्य नहीं है कि दोनों तंत्र द्वारा परिणाम लौटाया int SomeFn(int p1, int p2, int *ErrCode)जा सकता है, उदाहरण के लिए , संभावित रूप से वापसी परिणाम दोनों में वापसी कर सकते हैं और सामग्री को संशोधित करके ErrCode

एक 3 विधि

पूर्णता के लिए लौटने के परिणामों के लिए एक तीसरा तंत्र साइड-इफ़ेक्ट या ग्लोबल है , अर्थात फ़ाइल स्कोप, प्रोग्राम वाइड, साझा या पर्यावरण मान। यह आमतौर पर बुरी खबर माना जाता है, जब तक कि बहुत अच्छी तरह से प्रलेखित नहीं किया जाता है, आप केवल यह पता लगा सकते हैं कि कोड के सावधानीपूर्वक पढ़ने से क्या बदल रहा है। C / C ++ जैसी भाषाओं में, किसी दिए गए नाम के साथ एक बाहरी स्कोप वैरिएबल होने से यह सब करना बहुत आसान है, संभवतः किसी अन्य मॉड्यूल में भी, और उसी नाम का कोई स्थानीय स्कोप वैरिएबल नहीं है। पायथन में, जब तक आप बाहरी स्कोप में मूल्यों के मूल्यों को पढ़ सकते हैं, जब तक कि बाहरी गुंजाइश के मानों को स्पष्ट रूप से सेट नहीं किया जाता है, जिसे संशोधित करने के लिए उपलब्ध हैglobal कीवर्ड, एक बाहरी गुंजाइश चर को स्वचालित रूप से संशोधित करने का प्रयास उसी नाम का एक स्थानीय बनाता है।


आह, मैं इन शर्तों से परिचित हूं, हालांकि मुझे यकीन नहीं था कि एक वास्तविक शब्द था जो फ़ंक्शन का वर्णन करता है । जैसा (The reverse function is a _______ function.कि) में कहा जा रहा है, यह लगभग उसी तरह की प्रतिक्रिया है जो मैंने अपने दोस्त को दी थी, इसलिए मैं आपकी पुष्टि की सराहना करता हूं - हालांकि मैं अभी भी सोच रहा हूं कि क्या विशिष्ट शर्तें हैं। मैं प्रश्न को थोड़ा खुला रखने जा रहा हूं, लेकिन निश्चित रूप से इसे स्वीकार करूंगा क्योंकि घटना में ये शब्द बस मौजूद नहीं हैं।
सैंटी

2
कुछ भाषाओं में, जैसे कि अजगर, आपके पास ऐसी कक्षाएं भी हो सकती हैं जो खुद को संशोधित करती हैं - जबकि कुछ संदर्भों में इस "मंकी पैचिंग" को एक अच्छी बात माना जाता है, जबकि इसे "सेल्फ मॉडिफाइंग कोड" माना जाता है और इसे मना किया जाता है। आपके पास "विकासवादी कोड" भी हो सकता है जहां कोड के टुकड़े बेतरतीब ढंग से "उत्परिवर्तित" और / या संयुक्त होते हैं और फिर किसी तरह "सर्वश्रेष्ठ" प्रदर्शन के लिए परीक्षण और चुने जाते हैं।
स्टीव बार्न्स ने

-1। चाहे तार परस्पर परिवर्तनशील हों या अपरिवर्तनीय, उस पर कार्य करने वाले कार्य से कोई लेना-देना नहीं है। फ़ंक्शन उत्परिवर्तनीय या अपरिवर्तनीय नहीं है, और यह "लौटना या इन-प्लेस" नहीं है। फ़ंक्शंस उनके तर्कों को संशोधित कर सकते हैं और फिर भी वापस आ सकते हैं।
मील्स राउत

@MilesRout ने उस फ़ंक्शंस को जोड़ा, जो अभी भी बदले हुए हैं और फिर भी स्पष्टता के लिए कुछ C / C ++ उदाहरण हैं जो पूर्णता के लिए साइड इफेक्ट्स का परिणाम देते हैं।
स्टीव बार्न्स

4

इसे व्यक्त करने का मेरा पसंदीदा तरीका है:

  • ऐरे reverseविधि उत्परिवर्तन है । यह एक उत्परिवर्ती है । एक सामान्य विशेष मामला एक सेटर है

  • स्ट्रिंग replaceविधि गैर-उत्परिवर्तन है । यह एक उत्परिवर्ती नहीं है । यदि यह कुछ भी संशोधित नहीं करता है , तो यह साइड-इफ़ेक्ट फ्री है । एक सामान्य विशेष मामला एक गटर है

  • चूंकि जावास्क्रिप्ट स्ट्रिंग्स अपरिवर्तनीय हैं , स्ट्रिंग विधियों को परिवर्तित नहीं किया जा सकता है।

    "हैलो वर्ल्ड" .replace ("हैलो", "अलविदा");

    आपको असहज करना चाहिए। यह एक स्ट्रिंग शाब्दिक को संशोधित नहीं करता है। यह परिणाम को त्यागता है। स्टेटिक कोड एनालाइजर कभी-कभी ऐसे बग्स का पता लगा सकता है।

  • चूंकि जावास्क्रिप्ट एरर्स म्यूटेबल हैं , एरे तरीकों को म्यूट किया जा सकता है। जावास्क्रिप्ट Arrays का उपयोग स्थानीय भंडारण डिब्बे के रूप में करता है, आसानी से संशोधित और बार-बार कॉपी किया जाता है।

2

कभी-कभी, जब शुद्ध कार्यात्मक प्रोग्रामिंग के संदर्भ में उपयोग किया जाता है, तो मैंने उन कार्यों को सुना है जो इनपुट मूल्य को संशोधित करते हैं (और इसलिए शुद्ध कार्य नहीं हैं) विनाशकारी कहलाते हैं । मुझे यकीन नहीं है कि यह सही शब्द है, हालांकि।

आपके मामले में, आप कहेंगे:

आपको स्ट्रिंग को "स्ट्रिंग डॉट रिप्लेस" पर सेट करना होगा, क्योंकि रिप्लेस फंक्शन विनाशकारी नहीं है

आपको "सरणी डॉट रिवर्स" के बराबर एक सरणी सेट करने की आवश्यकता नहीं है, क्योंकि रिवर्स विनाशकारी है


1

शायद शुद्ध वह शब्द है जिसकी आपको तलाश है?

replace()शुद्ध (या प्रतीत होता है) शुद्ध है क्योंकि ऐसा नहीं लगता है कि इसका कोई दुष्प्रभाव है (यानी, स्ट्रिंग को संशोधित करना) जबकि reverse()अशुद्ध है क्योंकि यह सरणी की स्थिति को बदलता है।


यह एक संबंधित अवधारणा है, लेकिन यह भी अन्य गुणों (उदाहरण के लिए वैश्विक राज्य तक पहुँचने और हमेशा एक ही इनपुट के लिए एक ही उत्पादन उपज) का मतलब है।
जैकब राइले

1

इन्हें आमतौर पर फ़ंक्शंस और विधियों में विभाजित किया जाता है (जहाँ विधियाँ फ़ंक्शंस का सबसेट होती हैं)। एक फ़ंक्शन कोड का एक भाग है जिसे अलगाव में कहा जा सकता है, जबकि एक विधि में एक वर्तमान 'संदर्भ' की अवधारणा है, जिस पर वह संचालित होता है। एक विधि की कार्रवाई उसके संदर्भ की स्थिति को बदल देती है।

ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग में, संदर्भ वह उदाहरण है जो फ़ंक्शन चालू है।


0

मुझे नहीं पता कि कोई आधिकारिक जवाब है, लेकिन यहां दो आपको पसंद आ सकते हैं।

प्रक्रिया

केवल इसलिए कि यह इस सवाल का एक अच्छा जवाब लग रहा था , जो आपके प्रश्न BTW-- जैसा दिखता है - आपको इसकी जांच करनी चाहिए।

इन-प्लेस एकरी ऑपरेशन

इस पृष्ठ की समीक्षा करें: java.util.function । यह विभिन्न प्रोटोटाइप के प्रतिनिधियों (इनपुट / आउटपुट हस्ताक्षर) के लिए एक प्रकार का बना हुआ नाम प्रदान करता है, उदाहरण के लिए एक प्रतिनिधि जो एक तर्क लेता है और कुछ भी नहीं देता है उसे उपभोक्ता कहा जाता है ।

अब, ओओपी के एक सूक्ष्म छात्र के रूप में, आपको यह पता होना चाहिए कि एक विधि सिर्फ एक फ़ंक्शन है जो एक छिपे हुए पैरामीटर ( this) को लेता है । चूंकि यह एक संदर्भ के रूप में प्रदान किया जाता है, यह एक इनपुट और आउटपुट पैरामीटर दोनों के रूप में कार्य करता है।

इन जावा दोस्तों के अनुसार (और वे बहुत स्मार्ट लगते हैं), एक प्रतिनिधि जो एक इनपुट को स्वीकार करता है और एक ही प्रकार का मान लौटाता है, एक अपर ऑपरेटर कहलाता है ।

अब के मामले में array::Reverse(), एक सरणी अपरिवर्तनीय नहीं है, और संभावित रूप से बहुत अधिक स्थान ले सकती है, इसलिए यह जगह में ऑपरेशन करने के लिए अधिक कुशल और सुविधाजनक है। इसलिए Reverse()एक है यथा-स्थान एकल ऑपरेटर

लेकिन मेरे लिए, एक "ऑपरेटर" एक विशेष प्रतीक है (जैसे अतिरिक्त ऑपरेटर, जिसे भी जाना जाता है +) या एक गणितीय कीवर्ड जैसे mod। इसलिए मैं इसे ऑपेरट आयन कहना पसंद करता हूं , इन-प्लेस अनरी ऑपरेशन


आप अवधारणाओं को मिला रहे हैं। Reverse()एक ऑपरेटर नहीं है, एक एकल ऑपरेटर एक ही प्रकार का मान प्रदान की जरूरत नहीं है (उदाहरण के लिए !, delete, typeof), और ऑपरेटरों के प्रतिनिधियों नहीं हैं। लेकिन "इन-प्लेस" एक विधि के लिए एक अच्छा शब्द है जो इसके उदाहरण को संशोधित करता है। [मैंने वोट डाउन नहीं किया, लेकिन ऐसा लगता है कि किसी ने सभी उत्तरों को डाउन-वोट किया, भले ही वे सभी उपयोगी हों।]
जेरी १०११

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

ओह मैं समझा! ध्यान दें कि लैम्बदास को जावा में वापस लाने के लिए, उन्होंने एक कार्यात्मक इंटरफ़ेस (केवल 1 विधि के साथ एक जावा इंटरफ़ेस) के विचार पर बनाया था ताकि हम "कार्य" के रूप में लागू करने के लिए साधारण जावा वस्तुओं के आसपास से गुजर सकें। (ब्रायन गोएट्ज़ ने लंबोदर को जोड़ने पर एक तकनीकी बात की है। कई बार वह कहते हैं "स्पष्ट दृष्टिकोण चूसा होगा।") स्ट्रीम प्रोसेसिंग ऑब्जेक्ट्स के लिए कार्यात्मक इंटरफेस बनाते समय , वे "ऑपरेटर" जैसी अपमानजनक शर्तों का उपयोग करते हैं। यह भ्रामक है! उन्हें अच्छे नामों से भागना होगा। मुझे नहीं लगता कि यह OOP विधियों के लिए शर्तों का एक अच्छा स्रोत है जो रिसीवर ऑब्जेक्ट को संशोधित / संशोधित नहीं करते हैं।
जेरी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.