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?
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.
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
Auf diese Weise können Sie sicher require 'unsafe_gem'
.
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.
Tags und Links ruby namespaces gem