Hallo,

> ist es mglich ein Modul wieder aus dem Speicher zu entfernen?
> also require 'xyz' wieder rckgngig zu machen

Die Frage ist unklar: Module und `require` haben nichts miteinander
zu tun.

Ein Modul aus dem Speicher zu entfernen ist einfach: Module sind
Objekte wie jedes andere Objekt auch. Wenn keine Referenzen mehr
auf dieses Objekt zeigen, ist das Objekt unerreichbar und damit
fr die automatische Speicherbereinigung in Frage kommend.

Na gut, streng genommen entfernt das nicht das Modul aus dem
Speicher sondern es ermglicht lediglich der automatischen
Speicherbereinigung, es aus dem Speicher zu entfernen. Das muss
nicht zwingend sofort geschehen, tatschlich muss es berhaupt
nicht geschehen. Das Resultat ist aber das gleiche: das Modul ist
unerreichbar.

`require` tut nichts weiter als die Datei auszufhren.
(Vorausgesetzt, die Datei wurde nicht zuvor schon einmal
`require`t.) Ein `require` rckgngig zu machen wre also
quivalent dazu, die Seiteneffekte eines beliebigen Ruby-Programmes
umzukehren und rckwrts auszufhren.

Der Bereich der Informatik, welcher sich mit diesem Problem
beschftigt, nennt sich Reversible Computing. Es ist, tatschlich,
unter ganz bestimmten, engen Bedingungen mglich, Programme
vorwrts und rckwrts auszufhren. Ruby jedoch erfllt diese
Bedingungen nicht.

Hier ist ein simples Beispiel eines `require` welches nicht
rckgngig gemacht werden kann. Nehmen wir an, wir haben einen
durch Ruby gesteuerten Roboter-Arm, welcher in seiner Greif-Hand
momentan ein volles Weinglas 2m ber dem Betonboden hlt.
Weiterhin nehmen wir an, wir haben folgende Datei `xyz.rb`:

```
#!/usr/bin/env ruby

require 'robot'

Robot.open_hand
```

Wenn wir nun `require 'xyz'` ausfhren, dann ffnet der Roboter
die Hand, das Glas fllt zu Boden und zerspringt in Tausend
Scherben, der Wein verteilt sich berall auf dem Boden.

Was wrde es nun bedeuten, require 'xyz' wieder rckgngig zu
machení╚?

* Das Glas msste sich wieder zusammensetzen,
* Der Wein msste in das Glas springen und
* Das Glas msste in die Hand des Roboters springen.

Es sollte offensichtlich sein, dass das nicht mglich ist. Ein
etwas realistischeres Beispiel:

```
#!/usr/bin/env ruby

puts 'Hello World'
```

oder

```
#!/usr/bin/env ruby

class Object
  def inspect
    'Na na na na naaa naaa!'
  end
end
```

Also: es ist mglich, alle Referenzen auf ein Modul zu entfernen,
was frher oder spter dazu fhrt, dass es von der automatischen
Speicherbereinigung aus dem Speicher entfernt wird. Es ist jedoch
unmglich, ein `require` rckgngig zu machen.

Gre,
    Jrg.

Unsubscribe: <mailto:ruby-talk-request / ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-talk>