[ruby-de] self.destroy

Robert Klemme shortcutter at googlemail.com
Mi Jun 28 19:31:16 JST 2017


2017-06-28 10:04 GMT+02:00 Martin J. Dürst <duerst at it.aoyama.ac.jp>:
>
> On 2017/06/28 16:15, Die Optimisten wrote:

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

Sobald Referenzen im Spiel sind, ist es vorbei mit dem "für sich
selbst verantwortlich sein" - jedenfalls nicht mehr ausschließlich.

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

Wenn ein Knoten mehrere Eltern hat, ist der Graph kein Baum!

>> 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;

Je, nach Anwendungsfall kann es nötig sein, dem Objekt vorher noch
mitzuteilen, dass es jetzt entfernt wird. Aber das kann man so im
luftleeren Raum ohne konkretes Problem nicht abschließend beantworten.

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

Doch, das kann man in C machen. Es hat dann allerdings oft
katastrophische Folgen oder führt zu schwer auffindbaren Fehlern.

Ciao

robert

-- 
[guy, jim, charlie].each {|him| remember.him do |as, often| as.you_can
- without end}
http://blog.rubybestpractices.com/


Mehr Informationen über die Mailingliste ruby-de