Compte tenu d'un gemme définissant des classes de niveau supérieur qui s'affrontent avec un certain code que j'ai écrit, est-il possible d'exiger que toutes ses classes soient regroupées à l'intérieur d'un module que je puisse définir? Par exemple, si un danger_gem définit une classe: J'aurais besoin de quelque chose comme: p> afin que je puisse distinguer entre: Quelques détails supplémentaires: strong> Mon code (par exemple, la classe "mot") est déjà enveloppée dans son propre espace de noms. Cependant, je souhaite pouvoir fournir à l'utilisateur la possibilité de permettre une forme de «sucre syntaxique», qui rend certaines classes directement accessibles dans l'espace de noms de niveau supérieur. Cela crée cependant un nom de nom avec l'une des gemmes que j'utilise, ce qui définit une classe de niveau supérieur. Aucune des solutions actuellement proposées ne fonctionne car la gemme repose en réalité sur sa classe définie dans le monde entier; Donc, indéfinir la classe enfreint le gemme. Bien sûr, le gemme dispose de plus d'un fichier et nécessitant individuellement ses fichiers dans un module semble être une solution très fragile. Actuellement, la seule solution de contournement que j'ai trouvée est la suivante: P> begin
# Require the faulty gem.
require 'rbtagger'
rescue
# If syntactic sugar is enabled...
if NAT.edulcorated?
# Temporarily remove the sugar for the clashing class.
Object.const_unset(:Word); retry
else; raise; end
ensure
# Restore syntactic sugar for the clashing class.
if NAT.edulcorated?
Object.const_set(:Word, NAT::Entities::Word)
end
end
3 Réponses :
Je pense que votre meilleur pari est d'envelopper votre propre code dans un module. En fonction de la quantité de code que vous avez écrit, cela peut être une douleur énorme. Cependant, c'est le meilleur moyen de ne pas être sûr que votre code ne s'affrontera pas avec quelqu'un d'autre.
Donc votre classe code> Classe devient p> De cette façon, vous pouvez en toute sécurité nécessiter 'nonafe_gem' code>. P> p>
La réponse simple est "non"
si nous avons un fichier "word.rb"; p> et nous essayons et que nous essayons code> > Il sera toujours chargé dans la portée globale. p> Si vous saviez que le gemme n'était qu'un seul fichier, vous pouvez cependant suivre ce qui suit. P> module SafeContainer
module_eval(File.read("word.rb"))
end
Une autre, éventuellement meilleure réponse, vient de Ce Question.
Profitez du fait que les classes et les modules ne sont que des objets, comme: p> Vous devez vous assurer que dangereux_gem code> définit uniquement une classe et que vous
nécessite code> avant de définir vos propres classes et modules afin de ne pas définir accidentellement vos propres trucs sur
nil code>. p> < / p>
Où doit-on mettre cela pour travailler? Est-ce un initialiseur? Est-ce un fichier dans / lib? Je suis essayé de créer une initialiseur, mais je reçois "Impossible de charger un tel fichier". Edit: Jamais dû inclure un joyau auparavant. Je mets des traits de soulignement au lieu de se préparer et ça s'est éloigné. Je ne sais pas si cela le fait fonctionner réellement.