GSUB! Модифицирует неопределенные строки - PullRequest
1 голос
/ 06 июня 2010

Я извлекаю некоторую информацию из файла XML и хочу внести некоторые изменения в данные, сохраняя копию оригинала в переменной «origFile». Вот что у меня есть:

require "rexml/document"
include REXML

doc = Document.new File.new(thePath)
root = doc.root 
array = []
root.elements.each("dict/string") {|element| array << element}

origFile = []
root.elements.each("dict"){|i| origFile << i}

theBody = array[6][0].to_s

theBody.gsub!(/\&lt;!-- more --\&gt;/, "----------Read More----------")

Проблема в том, что после выполнения gsub! На theObid у origFile также есть модификация. Я не понимаю, почему это будет или как это исправить. Буду очень признателен за вашу помощь.

Ответы [ 2 ]

2 голосов
/ 06 июня 2010

Только так:

theBody = array[6][0].to_s.dup

Без .dup обе ваши переменные ссылаются на одну и ту же строку. С его помощью TheBody получает отдельную копию.

1 голос
/ 06 июня 2010

Вы изменяете строку на месте, что означает, что вы также изменяете любую другую ссылку на эту строку. Если вы хотите изменить только theBody, используйте dup, чтобы скопировать строку и создать ее новый экземпляр:

theBody = array[6][0].to_s.dup
theBody.gsub!(/\&lt;!-- more --\&gt;/, "----------Read More----------")

Вы также можете просто использовать gsub (без !):

theBody = array[6][0].to_s
theBody = theBody.gsub(/\&lt;!-- more --\&gt;/, "----------Read More----------")

Я бы порекомендовал это:

theBody = array[6][0].to_s.
  gsub(/\&lt;!-- more --\&gt;/, "----------Read More----------")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...