有人可以解释以下两行代码之间的区别:
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中的引用传递所有内容吗?
答案 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