2012-03-30 14 views
5

Podría alguien explicar la diferencia entre las siguientes dos líneas de código:Rubí gsub no cambia el contenido al establecer el contenido hace

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

En el siguiente código:

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 

El el código como se presenta arriba cambia @doc. Si bien utilizo la línea 1 con gsub!, no tiene efecto en @doc. ¿Tiene esto que ver con cómo los bloques manejan sus parámetros? ¿No debería pasar todo por referencia en Ruby a menos que se haya copiado explícitamente usando un método?

Respuesta

4

Comprobación 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; 
} 

Se hace una copia del contenido, así como modificaciones del mismo sólo afectan a esa copia, y no el valor interno de los contenidos del nodo.

El uso de 'element.content =' llama a un método independiente que hace modificar el valor interno:

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

es el método propuesto por el PO de la manera correcta de hacer cambios 2. element.content = element.content .gsub ("# {i}", "# {a [i]}") – nilanjan

Cuestiones relacionadas