2012-04-30 11 views
6
module Pigged 
    String.class_eval do 
    def pig 
     newstring = self + self[0]; newstring[0] = ""; newstring += "ay" 
     return newstring 
    end 
    end 
end 

प्रासंगिक कोड है। मैं क्या करना चाहता हूं एक विधि बनाना है, pig!, जो मूल स्ट्रिंग को संशोधित करता है। मैं स्वयं को संशोधित किए बिना ऐसा कैसे करूं, क्योंकि इसकी अनुमति नहीं है ...?संशोधित स्व, रूबी

उत्तर

3

आपको स्वयं को संशोधित नहीं करना चाहिए।

उपयोग replace या एक कस्टम विधि। अधिक जानकारी के लिए

पढ़ें 'Writing method "change!" for String'।

+2

नहीं वास्तव में। लाइब्रेरी में * टन * चीजें हैं जो करते हैं। उदाहरण के लिए 'स्ट्रिंग # <<' लें। यह मौजूदा स्ट्रिंग को संशोधित करता है और रूबी प्रोग्रामिंग ('puts' और '+' जैसी चीजों के पीछे) में सबसे अधिक उपयोग किए जाने वाले तरीकों में से एक है। – Linuxios

+1

यह उत्तर बेहतर है: http://stackoverflow.com/a/10391724/199712 –

4

स्ट्रिंग के लिए, आप सामग्री को बदलने के लिए self.replace का उपयोग कर सकते हैं।

अन्य कक्षाओं के लिए, मुझे नहीं लगता कि यह एक नई वस्तु बनाने तक स्वयं को संशोधित कर सकता है।

1

self को संशोधित करने के बारे में कुछ भी गलत नहीं है, आप इसे असाइन नहीं कर सकते हैं, लेकिन आप इसे संशोधित करने के लिए एक्सेसर विधियों का उपयोग कर सकते हैं या इंस्टेंस चर को संशोधित कर सकते हैं यदि आपके पास सीधे पहुंच है। String#replace इस विशेष मामले में एक एक्सेसर है।

एक और उदाहरण: याद करने के लिए

class Array 
    def delete_first_element! 
    self[0..0] = [] 
    end 
end 

a = [1,2,3] 
b = a 

a.delete_first_element! 

puts a.inspect # [2,3] 
puts b.inspect # [2,3]! 

एक बात - आप (मेरे उदाहरण में b) एक ही वस्तु के सभी संदर्भों को बदलने!

13

मैं अपने कोड एक छोटे से गाढ़ा और pig! विधि जोड़ दिया है:

module Pigged 
    String.class_eval do 
    def pig 
     self[1..-1] + self[0] + 'ay' 
    end 
    def pig! 
     self.replace(pig) #self.replace(self[1..-1] + self[0] + 'ay') 
    end 
    end 
end 
+1

'सुअर! 'सामान्य गणना दोहराने से बचने के लिए' self.replace pig 'होना चाहिए। – dbenhur

+1

मुझे इस उत्तर को छोड़कर उत्तर से बेहतर पसंद आया क्योंकि आपने समाधान प्रदान किया था। मान लीजिए मैं आलसी हूँ - लेकिन हमें एक और लिंक क्यों क्लिक करें? – UncleAdam

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