2012-03-30 3 views
5

説明してもらえん:次のコードでルビーGSUBは、内容を変更していない人は、次の2行のコードの違い

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には影響しません。これはブロックがそのパラメータをどのように扱うかと関係がありますか?メソッドを使って明示的にコピーされない限り、Rubyですべての参照を渡すべきではありませんか? http://nokogiri.org/Nokogiri/XML/Node.htmlをチェック

答えて

4

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

コンテンツのコピーが作成されるが、それへの変更は、そのコピーに影響を与え、そしてノードの内容のない内部値。

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

2 element.content = element.content OPによって変更する正しい方法を提案した方法であって

用い「element.content =」は、内部値を変更しない別のメソッド呼び出し.gsub( "#{i}"、 "#{a [i]}") – nilanjan

関連する問題