6
votes

Un objet rubis peut-il détruire un autre?

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


1 commentaires

Merci à tout le monde pour m'aider à comprendre les possibilités mieux. :)


5 Réponses :


2
votes

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.


2 commentaires

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.



0
votes

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.

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à.


0 commentaires

1
votes

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.

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.

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.

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.


2 commentaires

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 n'est pas transmis, les objets stockés en eux sont. Une variable n'est qu'une référence à un objet.



0
votes

Un objet rubis (généralement) ne devrait pas 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.

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.)


0 commentaires

7
votes

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. xxx

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.


1 commentaires

Merci! J'ai mis à jour ma question avec une approche basée sur votre suggestion.