2010-08-06 4 views
14

ich folgende in der Datei a.rb habe:Unload eine rubin Klasse

require foo 

und ich brauche foo zu entladen, die foo aus b.rb, c.rb und anderen Dateien zu laden.

Wie kann ich tun?

+0

was foo ist, und warum haben Sie Klassen mit dem gleichen Namen verschiedene Dinge in verschiedenen Dateien zu tun? – Doon

+0

in a.rb: Klasse Foo ... Ende Ich brauche es, weil ich Foo.bar in jeder rb-Datei ausführen muss, und ich kann nicht rb-Dateien bearbeiten. – tapioco123

+0

ist jede Foo.bar anders? oder sind sie das gleiche Foo? – Doon

Antwort

17
Object.send(:remove_const, :Foo) 

vorausgesetzt, Ihre Klasse heißt Foo.

+1

Dies funktioniert nur einmal .. – tapioco123

+0

irb (main): 002: 0> 'Timeout' erfordern => true irb (main): 004: 0> Object.send (: remove_const,: Timeout) => Timeout irb (main): 005: 0> erfordert 'timeout' => false – tapioco123

+0

mhh, ja, weil checks verlangen, ob es diese lib bereits geladen hat, vielleicht musst du 'load' anstelle von' verwenden require '... warum musst du das const trotzdem entladen? Kannst du keine Module oder irgendetwas benutzen, um sie abzuschirmen? PS: Sie müssen die Dateierweiterung in "laden" – lwe

2

Ich bin mir nicht sicher über das Entladen, aber mit load statt require wird immer die Datei neu geladen. Wenn Sie jedoch load verwenden, müssen Sie die .rb-Datei hinzufügen. In Ihrem Fall wäre das also load 'foo.rb'.

Siehe http://www.fromjavatoruby.com/2008/10/require-vs-load.html

Kernel#load docs
Kernel#require docs

+0

Das Problem dabei ist, wenn Sie eine Instanzvariable innerhalb einer Klasse definieren und laden Sie die Datei, und entfernen Sie dann die Instanzvariable, und laden Sie die Datei erneut, die Instanz Die Variable existiert immer noch, obwohl Sie sie entfernt haben. Grund ist, dass die zweite Definition, wenn Sie eine Klasse zweimal definieren, zu dem hinzuaddiert, was bereits existiert, anstatt sie vollständig neu zu definieren. –

+0

In einer Produktionsumgebung, die nicht gestoppt werden sollte, würde dies den Zugriff auf Methoden ermöglichen, die aus der Klasse gelöscht und mit load "neu geladen" werden sollten –