2012-03-30 34 views
5

Có thể ai đó xin vui lòng giải thích sự khác biệt giữa hai dòng mã sau đây:của Ruby gsub không làm thay đổi nội dung trong khi thiết lập các nội dung không

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

Trong đoạn mã sau:

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 

Các mã như đã trình bày ở trên không thay đổi @doc. Mặc dù nếu tôi sử dụng dòng 1 với gsub! thì nó không có hiệu lực trên @doc. Điều này có liên quan đến cách khối xử lý các tham số của chúng không? Không phải tất cả mọi thứ sẽ được thông qua bằng cách tham chiếu trong Ruby trừ khi sao chép rõ ràng bằng cách sử dụng một phương pháp?

Trả lời

4

Kiểm tra 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; 
} 

Một bản sao của nội dung được thực hiện, vì vậy bất kỳ thay đổi để nó chỉ ảnh hưởng đến bản sao đó, và không phải là giá trị nội bộ các nội dung của node.

Sử dụng 'element.content =' gọi một phương thức riêng biệt mà không sửa đổi các giá trị nội bộ:

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

là phương pháp của OP đề xuất đúng cách để thực hiện thay đổi 2. element.content = element.content .gsub ("# {i}", "# {a [i]}") – nilanjan

Các vấn đề liên quan