en rubis, peut-on détruire un autre?
Par exemple: p>
class Predator < Creature
def eat(creature)
@energy += creature.energy
creature.die
end
end
fish = Creature.new
Creature.list #shows the fish
croc = Predator.new
croc.eat(fish)
Creature.list #no more fish
5 Réponses :
Rien ne peut être des ordures en toute sécurité recueillies jusqu'à ce qu'il n'y ait aucune référence dans une portée active. p>
Droite - et l'exemple de code était une tentative (incorrecte) de supprimer la seule référence à cet objet.
Si vous avez un besoin légitime de faire cela, vous ne devez probablement pas utiliser une langue de script de haut niveau où la mécanique du pointeur vous cache de vous.
Vous n'êtes pas "détruire un objet" - le GC le fait pour vous. Vous parlez d'être dans une méthode et de contacter dans la portée de l'appelant et de changer une liaison là-bas. P>
Si la liaison faisait partie d'un objet et que vous avez passé l'objet dans, vous pouvez le réaffecter (à nul) à partir de là. P>
Croc.eat (poisson) ne fera pas référence à la référence de Croc à la créature référencée par le poisson, mais notez que la variable "poisson" elle-même contient toujours une référence à cette créature. L'instance n'est pas des ordures. P>
Edit: Pensez-y de cette façon: Intérieur de Croc, vous n'obtenez pas de poisson, vous obtenez une copie de ce qui est à l'intérieur du poisson. La valeur du poisson est une référence à l'objet que vous avez créé avec créature.Nouveau. Une copie de cette référence est copiée dans la créature variable lorsque vous exécutez Croc.eat (poisson). Alors maintenant, les deux poissons et la créature ont donc des références au même objet. p>
C'est comme s'il y a un ballon flottant dans les airs, avec deux cordes attachées à elle. Le poisson tient une chaîne et la créature tire une autre chaîne. Lorsque vous définissez la créature à NIL, il libère sa tenue sur le ballon, mais le poisson maintient toujours le ballon par sa propre ficelle, de sorte que le ballon ne flottera pas sur le gros collecteur des ordures dans le ciel. P>
EDIT 2: Non, vous ne pouvez pas (sans une profonde magie profonde que ce serait une très mauvaise idée de fonctionner), contactez le poisson et essuyez sa référence à l'objet en question. P>
De l'intérieur croc.eat, puis-je dire "depuis que la variable" poisson "m'a été transmise, quand j'aurai fini, je vais mettre des" poissons "à Nil?"
@Nathan: Vous ne pouvez pas affecter les variables locales dans une autre liaison sans de jolis arcane et un piraime mal apprécié. N'oubliez pas que variables i> n'est pas transmis, les objets stockés en eux sont. Une variable n'est qu'une référence à un objet.
Un objet rubis (généralement) ne devrait pas em> détruire un autre. Ce n'est pas votre travail de vous inquiéter de savoir si des objets existent toujours ou non. La seule exception serait si vous utilisez un magasin de base de données - vous vous souciez peut-être de savoir si les objets sont supprimés ou non. P>
Mais en général, ma réponse est: vous ne devriez pas vous soucier de cela. (Les autres réponses ont du sens, cependant.) P>
Je pense que le problème est que vous envisagez du programme lui-même comme le monde dans lequel ces choses simulées vivent plutôt que de simuler une. et en supposant que le poisson < / Code> La variable était sortie de la portée, comme dans un programme correctement structuré, cet objet serait probablement des ordures. p> p>
Merci! J'ai mis à jour ma question avec une approche basée sur votre suggestion.
Merci à tout le monde pour m'aider à comprendre les possibilités mieux. :)