2012-02-28 12 views
10

मैं रुबी सीख रहा हूं और मैंने देखा है कि सम्मेलन द्वारा विधि नाम के अंत में एक विस्मयादिबोधक का मतलब है कि विधि किसी भी तरह से self को संशोधित करती है। self से तत्व को हटाए जाने के बाद slice! जैसे विस्मयादिबोधक चिह्न के साथ Array#delete अंत क्यों नहीं होता है? क्या मुझे कुछ मौलिक याद आ रही है?नामकरण सम्मेलन: अंत में # हटाए गए अंत में कोई विस्मयादिबोधक चिह्न क्यों नहीं है?

+0

मेरा अनुमान है क्योंकि '# delete' केवल हटा सकता है इसलिए इसे ध्वजांकित करने की आवश्यकता नहीं है। '# Upper_case' जैसे कुछ को किसी नए बनाए गए ऑब्जेक्ट को असाइन किया जा सकता है या उपयोग के निर्धारण पर मूल ऑब्जेक्ट को ओवरराइट कर दिया जा सकता है। – ScottJShea

+0

हां, लेकिन # ध्वज के साथ हटाए गए किसी भी क्लोन को निर्दिष्ट तत्व को घटा सकता है (यही वह है जो मुझे ध्वज की अनुपस्थिति के कारण अपेक्षित था) :) –

+0

संभव डुप्लिकेट [रूबी विधियों में विस्मयादिबोधक चिह्न क्यों उपयोग किए जाते हैं?] (Http: //stackoverflow.com/questions/612189/why-are-exclamation-marks-used-in-ruby-methods) –

उत्तर

15

Matz (रूबी के मुख्य इंजीनियर) के शब्दों में: (!)

धमाके मतलब यह नहीं है "विनाशकारी" है और न ही इसे की कमी विनाशकारी या तो गैर मतलब है। बैंग साइन का मतलब है "बैंग संस्करण अधिक अपने गैर बैंग समकक्ष से खतरनाक है; देखभाल के साथ संभाल"।

Array#delete में कम खतरनाक समकक्ष नहीं है, विस्मयादिबोधक की कोई आवश्यकता नहीं है।

4

"बैंग" विधियों का यह अर्थ यह नहीं है कि यह रिसीवर को संशोधित करता है। यह एक विधि का एक संकेत है जो मौजूदा विधि का एक और खतरनाक संस्करण है। रूबी 2.0 बदलने के लिए David A. Black's description अंतर, और response to a request देखें।

यह एक बहुत ही आम गलतफहमी है। बहुत उच्च वोट वाले गलत उत्तर here पर ध्यान दें।

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