"का उद्देश्य क्या है!" तथा "?" विधि के नाम के अंत में?


99

कभी-कभी मुझे रूबी में ऐसे तरीके दिखाई देते हैं जिनमें "?" तथा "!" उनके अंत में, जैसे:

name = "sample_string"
name.reverse
name.reverse!
name.is_binary_data?

मैं सोच रहा था कि उनका उद्देश्य क्या है? क्या वे सिर्फ सिंटेक्स गन्ना कर रहे हैं?


जवाबों:


160

पठनीयता के लिए यह "सिर्फ गन्ना बनाना" है, लेकिन उनके सामान्य अर्थ हैं:

  • !कुछ स्थायी या संभावित खतरनाक परिवर्तन करने के लिए समाप्त होने वाले तरीके ; उदाहरण के लिए:
    • Enumerable#sortजगह में क्रमबद्ध करते हुए वस्तु का एक क्रमबद्ध संस्करण Enumerable#sort!देता है।
    • रेल में, ActiveRecord::Base#saveयदि ActiveRecord::Base#save!कोई अपवाद नहीं है, तो बचत विफल हो जाती है।
    • Kernel::exitस्क्रिप्ट से बाहर निकलने का कारण बनता है, जबकि Kernel::exit!ऐसा तुरंत होता है, किसी भी निकास हैंडलर को दरकिनार कर देता है।
  • ?एक बूलियन के बदले में समाप्त होने वाले तरीके , जो एक वाक्य की तरह कोड को और भी अधिक सहज रूप से प्रवाहित करता है - if number.zero?"यदि संख्या शून्य है" जैसे पढ़ता है, लेकिन if number.zeroबस अजीब लगता है।

आपके उदाहरण में, name.reverseएक उलट स्ट्रिंग का मूल्यांकन करता है, लेकिन केवल name.reverse!पंक्ति के बाद ही nameचर में वास्तव में उलटा नाम होता है। name.is_binary_data?ऐसा लगता है कि " nameबाइनरी डेटा है?"।


22
एक महत्वपूर्ण बात यह है कि आपके पास केवल एक धमाका विधि होनी चाहिए, यदि आपके पास एक समान गैर-धमाका विधि हो। बैंग का उपयोग विधि के "अधिक आश्चर्यजनक" संस्करण को "कम आश्चर्यजनक" से अलग करने के लिए किया जाता है। यदि आपके पास केवल एक ही विधि है, तो किसी भेद की आवश्यकता नहीं है, और आपको इसे धमाके से नाम नहीं देना चाहिए। Array#clearउदाहरण के लिए देखें । यह सरणी को साफ करता है। सरणी को साफ़ करना स्वाभाविक रूप से इसे बदल देता है। इस बारे में कुछ भी आश्चर्यजनक नहीं है, नाम पहले से ही स्पष्ट है, इसलिए: कोई धमाका नहीं। रूबी-forum.com/topic/176830#773946 देखें ।
जोर्ज डब्ल्यू मित्तग

2
रूबी स्टाइल गाइड के अनुसार, @ JörgWMittag ने जो कहा, उसे जोड़ते हुए : संभावित खतरनाक तरीकों (यानी स्वयं या तर्कों को संशोधित करने वाले तरीकों से बाहर निकलें, बाहर निकलें! एक विस्मयादिबोधक चिह्न यदि उस खतरनाक विधि का सुरक्षित संस्करण मौजूद है
टॉड बर्डसाल

2
खबरदार, यह हमेशा मामला नहीं है। उदाहरण के लिए, रूबी एरे # कॉनटैट डॉक्स.रूबी- lang.org/en/2.0.0/Array.html#method-i-concat । जहाँ आप बुरी तरह से जल सकते हैं वह MyActiveRecordModel.column_names.concat (...) जैसा कुछ है। इसके बजाय आपको कॉनसैट करने से पहले इसे क्लोन करना होगा।
विंटोंडेशॉन्ग

15

प्रश्न चिह्न इंगित करता है कि विधि बूलियन लौटाती है। पहले से ही यहाँ उत्तर दिया गया है:

रूबी में प्रश्न चिह्न ऑपरेटर का क्या अर्थ है?

बैंग इंगित करता है कि विधि ऑब्जेक्ट पर ही कार्य करती है। पहले से ही यहाँ उत्तर दिया गया है:

रूबी विधियों में विस्मयादिबोधक चिह्न का उपयोग क्यों किया जाता है?


8

रूबी में ?इसका मतलब है कि विधि एक बूलियन को वापस करने जा रही है और !उस वस्तु को संशोधित करती है जिसे यह कहा जाता था। वे कोड को देखते समय पठनीयता में सुधार करते हैं।


5

इसके विपरीत - मुझे लगता है - प्रोग्रामिंग भाषाओं के बहुमत ...

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

अधिवेशन द्वारा, ऐसे तरीके जो प्रश्नों का उत्तर देते हैं (अर्थात # खाली करें; यदि रिसीवर खाली है तो सही है) प्रश्नवाचक चिन्ह में समाप्त होता है।

विस्मयकारी रूप से "खतरनाक" तरीके (अर्थात स्वयं को या तर्क को संशोधित करने वाले तरीके, निकास! आदि) सम्मेलन के अंत में विस्मयादिबोधक चिह्न के साथ।

से: http://www.ruby-lang.org/en/documentation/ruby-from-other-languages/ , सेक्शन मजेदार विधि नाम


1
साथ ही समाप्त होने वाली विधि ?को विधेय पद्धति कहा जाता है।
वसीम

1

खबरदार, यह हमेशा मामला नहीं है। उदाहरण के लिए, Ruby Array # concat http://docs.ruby-lang.org/en/2.0.0/Array.html#method-i-concat

जहां आप बुरी तरह से जल सकते हैं, कुछ ऐसा है MyActiveRecordModel.column_names.concat([url])। MyActiveRecordModel से संबंधित बाद की कॉलें MyActiveRecordModel के लिए 'url' के कॉलम को देखने और फेंकने का प्रयास करेंगी।

इसके बजाय आपको कॉनसैट करने से पहले इसे क्लोन करना होगा। सौभाग्य से मेरे टेस्ट सूट ने इसे पकड़ लिया, लेकिन .. सर!

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