2010-09-18 15 views
15

Array तरीकों में से कुछ धमाके संस्करण compact!, reject!, flatten!, uniq! वापसी nil अगर कोई बदलाव नहीं किए गए थे की तरह हैं:व्यवहार

[1,[2]].flatten! 
# => [1, 2] 
[1,2].flatten! 
# => nil 
[1,[2]].flatten 
# => [1, 2] 
[1,2].flatten 
# => [1, 2] 

[1,2,nil].compact! 
# => [1, 2] 
[1,2].compact! 
# => nil 
[1,2,nil].compact 
# => [1, 2] 
[1,2].compact 
# => [1, 2] 

अगर वे इसे इस तरह से किया था, वहाँ एक हो गया है कारण। कोई विचार क्या हो सकता है?

उत्तर

18

बैंग (!) विधियां वर्तमान वस्तु को जगह में संशोधित करती हैं, लेकिन the documentation प्रति प्रभावित तत्व नहीं होने पर वे nil लौटते हैं। यह उपयोगी है अगर, किसी भी कारण से, आपको कुछ करने की ज़रूरत है यदि आपने प्रश्न में सरणी को संशोधित किया है।

if array.flatten! 
    puts "Oh yeah... flattened that array!" 
end 
+2

यह एक अच्छा मुद्दा है। लेकिन आप 'रिटर्न सरणी.फ्लैटन' नहीं कह सकते हैं, जो मेरे लिए – artemave

+0

सच प्रतीत होता है। यदि आप यही चाहते हैं, तो आप 'वापसी array.flatten' (कोई धमाका नहीं) कहेंगे जो आपको मूल सरणी की एक फ़्लैटेड प्रतिलिपि वापस कर देगा। –

+6

जो मुझे एक प्रतिलिपि बनाने के लिए मजबूर करता है जहां मुझे आवश्यकता नहीं है। पहली जगह में टक्कर वाले संस्करण का उपयोग करके मुझे परेशानी हो रही है। – artemave

4

मैं धारणा हमेशा था कि Array तरीकों में से धमाके संस्करण एक ही रास्ता है कि वे घर में वस्तु को संशोधित में अलग हैं।

शायद समस्या यहां है कि इस धारणा वास्तव में नहीं है एक सही: according to David A. Black, ! मतलब यह नहीं है कि विधि अपने रिसीवर बदलेगा; ! का अर्थ है कि यह विधि अन्यथा समकक्ष विधि का "खतरनाक" संस्करण है, जिसका नाम ! से कम है।

कभी कभी तुम मिल एक से अधिक प्रकार "खतरे" यहाँ तक कि एक धमाके विधि के भीतर की :

अब खतरे कई रूपों (जोर मेरा) लेता है। String#gsub! लें। यह विधि अपने रिसीवर परिवर्तन:

str = "David" 
str.gsub!(/$/, " Black") 
str      # David Black 

यह भी gsub (गैर धमाके) कि में से अलग करता है, तो स्ट्रिंग परिवर्तन नहीं करता है, gsub रिटर्न अपरिवर्तित स्ट्रिंग की एक प्रतिलिपि लेकिन gsub! रिटर्न शून्य:

str.gsub(/xyz/, "blah") # David Black 
str.gsub!(/xyz/, "blah") # nil 
str      # David Black 

! gsub! में आपको एक हेड-अप देता है: यह आपको खतरे की चेतावनी देता है, और इसका मतलब है कि कि विधि का उपयोग करने से पहले, आप को यह पता लगाना चाहिए कि यह व्यवहार करता है। (एक सरल "ri String#gsub!" यह करना चाहिए।)

यह "सिर अप" अर्थ विज्ञान भी Array के धमाके के तरीकों पर लागू होता है।

+2

मैंने यह पोस्ट भी पढ़ा - यह कोई समझ नहीं आता है। 'खतरनाक' का अर्थ काउंटर-अंतर्ज्ञानी व्यवहार के निशान के रूप में सबसे अच्छा निर्धारित किया जाता है। खैर, शायद, उन्हें पहले स्थान पर ऐसा नहीं करना चाहिए था? – artemave

+1

और 'विधि का उपयोग करने से पहले, आपको पता होना चाहिए कि यह वास्तव में कैसे व्यवहार करता है' स्पष्ट रूप से रूबी तरीका नहीं है, जहां आमतौर पर सम्मेलनों का संपूर्ण पारिस्थितिकी तंत्र स्वाभाविक रूप से सही चीज़ की ओर जाता है। – artemave

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