Ruby gsub在设置内容时不会更改内容

时间:2012-03-30 01:15:38

标签: ruby nokogiri 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没有影响。这与块处理参数的方式有关吗?除非使用方法明确复制,否则不应该通过Ruby中的引用传递所有内容吗?

1 个答案:

答案 0 :(得分: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