2014-09-16 3 views
0

저는 몇 시간 동안 고생했습니다.두 개체 사이의 참조 깨짐

다른 개체에 영향을주지 않고 하나를 편집 할 수 있도록 두 개체 간의 연결을 끊으려고하지만 dup이 전혀 작동하지 않습니다.

dup Nokogiri :: XML :: NodeSet을 시도하면 원본보다 다른 object_id의 개체가 제공되지만 복사본을 수정하면 원본 노드가 영향을받습니다! Ruby에서 두 객체 간의 연결을 끊을 방법이 있습니까?

def copy(collection) 
    body = @doc.xpath("//w:body") 
    children = @doc.xpath("//w:body").children 
    body.children.map(&:remove) 

    collection.each do |record| 

    puts "it appears child is forever affected #{children}" 
    clone = children.dup 

    clone = Nokogiri::XML::NodeSet.new(@doc, clone) 
    parse_nodes clone, record 
    body.first << clone.to_xml 
    end 
end 
+0

해결책을 찾은 것 같습니다. 나는 그것을 곧 게시 할 것이다. 해결 방법은 to_xml로 변환 한 다음 구문 분석을 사용하여 노드 집합으로 다시 구문 분석하는 것입니다. 이 순간에 작동하는지 테스트하려고합니다. – Donato

+0

또한 문제가 재귀가 아니기 때문에 재귀 함수에 관한 다른 질문을 삭제했습니다. 참조 된 값입니다. – Donato

+2

'dup'이 작동하지 않는다는 것이 문제가 아닙니다. 'dup'은 외부 객체에서 작동한다는 것입니다. 그래서'NodeSet'을'dup'하는 것은 새로운'NodeSet'을 만들지 만 안에있는 노드는 같은 참조 노드입니다. 이것이 Rails와 다른 많은 인터페이스가'deep_dup' 메소드를 추가 한 이유입니다. – engineersmnky

답변

0

당신이 만드는 시도 할 수 당신이

dup_node_set = Nokogiri::XML::NodeSet.new(@doc, children.to_a.map(&:dup)) 

당신의 방법은 재귀이기 때문에 나는 그것을해야 가정 것이지만 그것이 당신을 위해 충분히 깊은 실행할 경우 확실하지 같은 자신의 NodeSet.

어떤이는 ArraychildrenNodeSet 변환 한 후 내부의 각 elementdup를 호출하고 새로운 NodeSet이를 통과하고있다.