Laden Sie Ruby Gem in einen benutzerdefinierten Namespace

9

Gibt es ein Juwel, das Klassen der obersten Ebene definiert, die mit Code kollidieren, den ich geschrieben habe? Ist es möglich, den Edelstein so zu verwenden, dass alle seine Klassen innerhalb eines Moduls gruppiert sind, das ich definieren kann? Zum Beispiel, wenn ein unsafe_gem eine Klasse definiert:

%Vor%

Ich würde etwas wie:

brauchen %Vor%

Damit kann ich unterscheiden zwischen:

%Vor%

Einige weitere Details: Mein Code (z. B. die Klasse "Word") ist bereits in einen eigenen Namensraum eingebettet. Ich möchte jedoch dem Benutzer die Möglichkeit geben, eine Form von "syntaktischem Zucker" zu aktivieren, die einige Klassen unter dem Namespace der obersten Ebene direkt zugänglich macht. Dies erzeugt jedoch einen Namenskonflikt mit einem der Edelsteine, die ich verwende, was eine Klasse der obersten Ebene definiert. Keine der derzeit vorgeschlagenen Lösungen funktioniert, weil das Juwel tatsächlich darauf beruht, dass seine global definierte Klasse da ist; Die Klasse zu durchbrechen, bricht also den Edelstein. Natürlich hat der Edelstein mehr als eine Datei, und seine Dateien einzeln in ein Modul zu laden, scheint eine sehr spröde Lösung zu sein. Derzeit ist die einzige Problemumgehung, die ich gefunden habe, diese:

%Vor%

Ich weiß nicht warum, aber das lässt meine Fußnägel wellig werden. Hat jemand eine bessere Lösung?

    
user2398029 06.01.2012, 18:22
quelle

3 Antworten

4

Eine andere, möglicherweise bessere Antwort kommt von dies Frage.

Nutzen Sie die Tatsache, dass Klassen und Module nur Objekte sind, so:

%Vor%

Sie müssen sicherstellen, dass unsafe_gem nur eine Klasse definiert, und dass Sie require it, bevor Sie Ihre eigenen Klassen und Module definieren, damit Sie nicht versehentlich Ihre eigenen Sachen auf nil setzen.

    
jergason 06.01.2012, 18:38
quelle
1

Ich denke, Sie sollten Ihren eigenen Code in ein Modul einpacken. Je nachdem, wie viel Code du geschrieben hast, kann dies ein großer Schmerz sein oder auch nicht. Es ist jedoch der beste Weg, um sicherzustellen, dass Ihr Code nicht mit dem eines anderen kollidiert.

So wird Ihre Word -Klasse

%Vor%

Auf diese Weise können Sie sicher require 'unsafe_gem' .

    
jergason 06.01.2012 18:31
quelle
0

Die einfache Antwort ist "nein"

Wenn wir eine Datei 'word.rb' haben;

%Vor%

und wir versuchen und require es, es wird immer im globalen Bereich geladen.

Wenn du wusstest, dass der Edelstein nur eine einzige Datei ist, kannst du Folgendes tun:

%Vor%

aber das wird in Ihrem Fall wahrscheinlich nicht funktionieren.

    
Matthew Rudy 06.01.2012 18:37
quelle

Tags und Links