2012-03-30 8 views
5

करता है किसी को कोड की निम्न दो पंक्तियों के बीच अंतर समझाने कृपया सकते हैं:रूबी gsub सामग्री परिवर्तन नहीं करता है, जबकि सामग्री की स्थापना

1. element.content.gsub!("#{i}", "#{a[i]}") 
2. element.content = element.content.gsub("#{i}", "#{a[i]}") 

निम्न कोड में:

a.each_index do |i| 
    @doc.traverse do |element| 
    if element.text? 
     element.content = element.content.gsub("#{i}", "#{a[i]}") 
    end 
    end 
end 
puts @doc 

उपरोक्त प्रस्तुत कोड @doc बदलता है। जबकि अगर मैं gsub! के साथ लाइन 1 का उपयोग करता हूं, तो इसका @doc पर कोई प्रभाव नहीं पड़ता है। क्या यह करना है कि ब्लॉक उनके पैरामीटर कैसे संभालते हैं? रूबी में संदर्भ द्वारा सब कुछ पारित नहीं किया जाना चाहिए जब तक कि एक विधि का उपयोग करके स्पष्ट रूप से कॉपी नहीं किया जाता?

उत्तर

4

http://nokogiri.org/Nokogiri/XML/Node.html जाँच हो रही है:

static VALUE get_content(VALUE self) { 
    xmlNodePtr node; 
    xmlChar * content; 
    Data_Get_Struct(self, xmlNode, node); 
    content = xmlNodeGetContent(node); 
    if(content) { 
     VALUE rval = NOKOGIRI_STR_NEW2(content); 
     xmlFree(content); 
     return rval; 
    } 
    return Qnil; 
} 

सामग्री की एक प्रति किया जाता है, तो यह कोई भी परिवर्तन ही नहीं की नकल नहीं नोड की सामग्री की आंतरिक मूल्य प्रभावित करते हैं।

का उपयोग करते हुए 'element.content =' कहता है एक अलग विधि आंतरिक मूल्य को संशोधित करता है कि:

def content= string 
    self.native_content = encode_special_chars(string.to_s) 
end 
+0

विधि ओपी द्वारा प्रस्तावित सही तरीके से परिवर्तन करने के लिए है 2. element.content = element.content .gsub ("# {i}", "# {a [i]}") – nilanjan

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