# Clonare un Element

**URL:** <https://www.ruby-forum.com/t/clonare-un-element/120633>\
**Category:** IT\
**Created:** [November 19, 2007, 12:58pm UTC](https://www.ruby-forum.com/t/clonare-un-element/120633 "2007-11-19T12:58:54Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![dcaseres](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/a87d85/32.png) [@dcaseres](https://www.ruby-forum.com/u/dcaseres)\
**Post date:** [November 19, 2007, 12:58pm UTC](https://www.ruby-forum.com/t/clonare-un-element/120633/1 "2007-11-19T12:58:54Z")

</div>

Ciao a tutti,  
sono nuovo nel mondo di Ruby e per impratichirmi sto provando a  
riscrivere dei vecchi programmi con questo nuovo linguaggio.  
Ho un problema con la gestione degli XML, per parsificarli e crearne di  
nuovi sto usando REXML.  
Ho creato un Element (netName) che vorrei inserire in due livelli di un  
XML, inizialemte avevo provato ad inserirlo direttamente con:

muxPar \<\< netName  
mux \<\< netName

ma procedendo in questo modo teneva valido solo il secondo inserimento  
(quello nell’element mux)  
ho provato quindi utilizzando il metodo clone di Element

```
netNameClone = netName.clone
muxPar << netName
mux << netNameClone

```

ma il metodo non clona l’Element per intero (come dice il doc: “Creates  
a shallow copy of self”), omettendo testo, attributi e sotto-elementi,  
generando quindi un unico elemento vuoto avente lo stesso nome.  
Qualcuno sa dirmi come posso fare per inserire l’element in entrambi gli  
antri due element senza dover rigenerare il secondo per intero?  
Grazie in anticipo

---

<div class="post-metadata">

**Author:** ![dcaseres](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/a87d85/32.png) [@dcaseres](https://www.ruby-forum.com/u/dcaseres)\
**Post date:** [November 19, 2007, 11:41pm UTC](https://www.ruby-forum.com/t/clonare-un-element/120633/2 "2007-11-19T23:41:31Z")

</div>

class Element

---

<div class="post-metadata">

**Author:** ![dcaseres](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/a87d85/32.png) [@dcaseres](https://www.ruby-forum.com/u/dcaseres)\
**Post date:** [November 19, 2007, 11:41pm UTC](https://www.ruby-forum.com/t/clonare-un-element/120633/3 "2007-11-19T23:41:51Z")

</div>

def deep\_clone  
Marshal::load(Marshal.dump(self))  
end

---

<div class="post-metadata">

**Author:** ![dcaseres](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/a87d85/32.png) [@dcaseres](https://www.ruby-forum.com/u/dcaseres)\
**Post date:** [November 19, 2007, 11:43pm UTC](https://www.ruby-forum.com/t/clonare-un-element/120633/4 "2007-11-19T23:43:57Z")

</div>

Cioe’ inserisci (sovrascrivi, usa add\_method o la metaprogrammazione) la  
funzione deep\_clone nella classe Element

---

<div class="post-metadata">

**Author:** ![dcaseres](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/a87d85/32.png) [@dcaseres](https://www.ruby-forum.com/u/dcaseres)\
**Post date:** [November 20, 2007, 10:30am UTC](https://www.ruby-forum.com/t/clonare-un-element/120633/5 "2007-11-20T10:30:03Z")

</div>

Funziona alla grande!  
Comodo il modulo marshal, da tenere il considerazione per il futuro 😉  
Grazie

Antonio Di Fluri wrote:

> scrivi cosi’ e la classe Element prendera’ in se il nuovo metodo  
> mantendo gli altri:  
> class Element  
> def deep\_clone  
> Marshal::load(Marshal.dump(self))  
> end  
> end

---

<div class="post-metadata">

**Author:** ![dcaseres](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/a87d85/32.png) [@dcaseres](https://www.ruby-forum.com/u/dcaseres)\
**Post date:** [November 19, 2007, 11:47pm UTC](https://www.ruby-forum.com/t/clonare-un-element/120633/6 "2007-11-19T23:47:35Z")

</div>

scrivi cosi’ e la classe Element prendera’ in se il nuovo metodo  
mantendo gli altri:  
class Element  
def deep\_clone  
Marshal::load(Marshal.dump(self))  
end  
end
