2012-03-30 10 views
5

Qualcuno potrebbe spiegare la differenza tra le seguenti due righe di codice:Rubino gsub non cambia il contenuto durante l'impostazione del contenuto fa

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

Nel codice seguente:

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 

Il il codice come presentato sopra cambia @doc. Mentre se uso la linea 1 con gsub! non ha alcun effetto su @doc. Questo ha a che fare con come i blocchi gestiscono i loro parametri? Non dovrebbe essere passato tutto per riferimento in Ruby se non è stato copiato esplicitamente usando un metodo?

risposta

4

Controllo 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; 
} 

Una copia del contenuto è fatto, quindi eventuali modifiche che influiscono solo quella copia, e non il valore interno del contenuto del nodo.

Uso 'element.content =' chiama un metodo separato che fa modificare il valore interno:

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

è il metodo proposto dal PO il modo di apportare modifiche 2. element.content = element.content .gsub ("# {i}", "# {a [i]}") – nilanjan

Problemi correlati