[ruby-de] self.destroy

Martin J. Dürst duerst at it.aoyama.ac.jp
Mi Jun 28 17:04:07 JST 2017



On 2017/06/28 16:15, Die Optimisten wrote:
> Hallo,
> 
> wie macht man denn am besten ein Baum-Objekt (mit vielen Knoten und 
> Blatt-Objekten),
> wenn ein Ast abbricht, schicke ich doch dem jeweiligen KNOTEN ein destroy
> (ich gehe mal davon aus, daß Ruby dann in Folge den Subbaum automatisch 
> aufräumt?!)
> (Anders schauts natürlich bei doppelt verketteten aus.)
> 
> Da jeder Knoten am besten für sich selbst verantworlich ist... (ist doch 
> schöner, als der Eltern-Knoten, davon gibts vielleicht mehrere (ok, hier 
> definitiv nicht), ...würden die Eltern hier gleich automatisch nil als 
> Verweis zum Kind haben.
> 
> also wäre ein
>      def destroy(knoten)
>        knoten[i]=nil
>      end
> doch am besten,
> womit ich - wenn ich das destroy dem Objekt schicke, dort in der Methode 
> self=nil hätte...
> 
> damit erspare ich mir das Rundherum:
>       destroy(knoten)
>          knoten.eltern.each{|eltern| eltern.child=nil}
>      end
> 
> Frage: wie macht man das destroy schön (elegant) und effizient?

Es geht tatsächlich am besten auf der Eltern-Stufe. Wie schon in einer 
früheren Mail erklährt, muss man die Referenzen löschen; das Objekt 
selbst wird dann von der Garbage-Collection entfernt. Wenn man das 
Objekt selbst löschen würde, so würden alle die Referenzen (von den 
Eltern) auf undefinierten Speicher zeigen.

Das ist auch in allen anderen Sprachen, die ich kenne, gleich. Man kann 
z.B. auch in C nicht einfach free(knoten) machen, da die Pointer auf 
'knoten' noch bestehen könnten.

Als einfaches Beispiel kannst Du Dir 
http://www.sw.it.aoyama.ac.jp/2016/DA/programs/8bintree.rb anschauen. 
Das wurde für eine Vorlesung als Pseudocode gemacht, also nicht 
gründlich getestet. Die Kommentare sind auf japanisch. Schau Dir insb. 
die insert und delete Methoden (es hat mehrere) an, sie erhalten alle 
Zuweisungen, da sich die Unterbäume (subtrees) ändern können.

Gruß,   Martin.


Mehr Informationen über die Mailingliste ruby-de