[ruby-de] Objekt löschen

Martin J. Dürst duerst at it.aoyama.ac.jp
Mo Jun 26 17:05:08 JST 2017


Die einfache Antwort ist "Selbstmord ist nicht erlaubt".

Aber nicht nur Selbstmord, auch andere Dinge wie

class A
     def change
         self = "changed"
     end
end

sind nicht erlaubt.

Der Grund dafür ist einfach: Objekte werden (mit wenigen Ausnahmen wie 
Symbole und 'kleine' Zahlen) als Referenzen gespeichert.

Nach
x = A.new; arr[]; arr[0] = x; x.destroy
scheint es einfach, dass arr[0] nun nil sein sollte. Aber wenn man
statt arr[0] = x; plötzlich z.B.
z = x; arr[0] = x; arr[27] = z; q = z;...
hat, dann wird es immer klarer, dass es kaum möglich ist, all diese 
Referenzen einfach auf nil zu setzen. Es bräuchte dafür eine zusätzliche 
Indirektion, und das ist zu teuer (dafür, dass man das nur äusserst 
selten braucht).

Wenn man ein Objekt nicht mehr braucht, kann man die Referenzen 
überschreiben, z.B.
z = nil; arr[0] = nil; arr[27] = nil; q = nil;...
Das Objekt wird dann bei der nächsten Garbage Collection eingesammelt.

Wenn das nicht reicht, empfehle ich für eine handgemachte Klasse so 
etwas wie:
class B
     def initialize;  @alive = true;  end
     def alive?;  @alive;   end
     def destroy;  @alive = false;  end
     ...
end

Objekte der Klasse B gibt es dann auch noch nach destroy, aber sie 
wissen dann selbst, dass sie nicht mehr lebend sind.

Für verschiedene Klassen (konkret: Array und String) kann man auch den 
Inhalt direkt ändern mit replace.

Den direkten Inhalt einer Variable (normalerweise eine Referenz auf ein 
Objekt) kann man in Ruby nur durch direkte Zuweisung an die Variable 
ändern. Die z.B. in C übliche swap-Funktion mit Pointern gibt es also nicht.

Gruß,   Martin.




On 2017/06/26 08:18, Die Optimisten wrote:
> Hallo,
> 
> class A
>    def destroy
>       self=nil
>        "erledigt"
>    end
> end
> 
> x=A.new
> arr=[]; arr[0]=x
> puts x.destroy    # Fehler: cant set self to nil
> # arr[0] sollte nun nil sein...
> 
> Wie tut man da?
> So einfach gehts leider nicht...
> 
> danke
> Andreas


Mehr Informationen über die Mailingliste ruby-de