2012-03-30 11 views
5

Czy ktoś mógłby wyjaśnić różnicę między następującymi dwiema liniami kodu:Ruby gsub nie zmienia zawartości podczas ustawiania zawartości robi

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

w poniższym kodzie:

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 

kod przedstawiony powyżej zmienia @doc. Podczas korzystania z wiersza 1 z gsub! nie ma to wpływu na @doc. Czy ma to związek z tym, jak bloki radzą sobie z ich parametrami? Czy nie powinno się przekazywać wszystkiego przez referencje w Ruby, chyba że jest to jawnie skopiowane za pomocą metody?

Odpowiedz

4

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

Kopia zawartości wykonana, więc do niej żadnych zmian wpływa tylko tę kopię, a nie wartość wewnętrzna zawartość węzła.

Korzystanie „element.content =” wywołuje odrębny sposób, że robi zmodyfikować wartość wewnętrzna:

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

jest metoda zaproponowana przez PO właściwą drogę do zmian 2. element.content = element.content .gsub ("# {i}", "# {a [i]}") – nilanjan

Powiązane problemy