2010-11-30 2 views
0

J'ai un objet d'instance nommé couches qui est un tableau d'objets de calque.Copie d'un objet de classe

J'essayez ce qui suit, et je reçois une erreur disant que je suis en train de vider une méthode de classe:

@best_copy = Marshal.load(Marshal.dump(@layers)) 

TypeError: no marshal_dump is defined for class Method 

Comment puis-je faire pour qu'il ne tente pas de sauver le attr_accessor, mais l'objet réel?

Répondre

1

Il semble qu'un ou plusieurs de vos calques aient une variable d'instance qui est une méthode. Est-ce que ça sonne bien? Marshal envoie un objet marshal_dump pour obtenir les données pour le marshaling, et à son tour les attributs de l'objet obtiennent également marshal_dump pour obtenir leurs données. Les méthodes ne peuvent pas être marshalées, donc quand le processus arrive à cette partie de l'objet, il se bloque en essayant de rassembler votre méthode.

+0

Ah ouais .. Je viens de réaliser .. J'ai un pointeur de fonction. attr_accessor: fptr. Y a-t-il une alternative à cela? En plus de supprimer le pointeur de fonction ou d'enregistrer des parties individuelles de l'objet. – Flethuseo

+1

@ user487980: Il n'y a pas d'alternative dans le cas général - vous ne pouvez pas marshaler les méthodes. Les objets avec du code exécutable dans une variable d'instance n'interagissent pas bien avec les bibliothèques d'archivage standard. L'approximation la plus proche serait un système ressemblant à Cocoa pour stocker une cible (l'objet qui implémente la méthode) et un sélecteur (le message pour invoquer la méthode). Ainsi, par exemple, si vous faites '@fptr = foo.method (: bar)', vous feriez plutôt '@target = foo; @selector =: bar'. – Chuck

Questions connexes