Vérifiez si le module existe en ruby
Je suis dynamiquement la définition d'un nom de module à partir d'un argument transmis à la cli, par exemple Required::Module::#{ARGV.first}
Est-il un moyen de vérifier si ce module existe? Aussi, comment pourrais-je exécuter des méthodes qui ne doit pas savoir que le nom exact?
- Intéressant. Il n'y a pas de réponse ici, et de notables machination est nécessaire. Bonne Question.
Vous devez vous connecter pour publier un commentaire.
Vérifier pour le module existence à l'aide de la
const_get
méthode:const_defined?
à la place.mod = Required::Module.const_defined?("ModuleName") ? Required::Module::const_get "ModuleName" : nil
Required::Module::ModuleName
- à la fois par l'intermédiaire deNameError
. Ceci est utile si le nom du module n'est connue qu'au moment de l'exécution si.Utilisation
const_defined?
pour cela.renvoie true ou false.
donne
"constant"
si elle existe, etnil
si elle ne le fait pas.Mise à jour: Désolé, ne lisez pas votre question correctement.
vous donner ce que vous êtes après.
defined?("Parade::Procedure::#{procedure.capitalize}")
retourne"expression"
, même si le module, je vais appeler n'existe pas.eval
, surtout sistring
est un utilisateur à la valeur entrée. Vous pourrait causer de sérieux dommages. (pour en lire plus stackoverflow.com/questions/637421/is-eval-supposed-to-be-nasty)Vous devez vérifier si:
Essayer ça:
Puis dans votre code:
Il sera de retour
true
si il y a un module du nom donné à l'intérieur d'un espace de noms donné de base. La différence entre les exemples donnés dans d'autres réponses, c'est qu'il sera de retourfalse
si le nom demandé reffers à une classe, et non à un module.Inclure des classes dans un test
Si vous voulez changer ce comportement et de la force de la méthode de retour également
true
pour les classes (et pas seulement des modules) changementinstance_of?
àis_a?
.OOP façon
Vous pouvez également le code dans une manière orientée objet si votre
Required::Module
module est le seul module que vous faites des tests pour les submodules:Puis dans votre code:
Si vous avez ActiveSupport
Dans le cas où vous
require
quelque chose qui s'étend à quelque chose d'autre, vous ne pouvez pas baser votre test sur une constante, car l'extension ne peut en définir un nouveau. Au lieu de cela, il base sur la présence de quelque chose d'autre, comme une nouvelle méthode.J'utilise le ci-dessous pour tester si open_uri_redirections a été nécessaire:
Actuellement sélectionné réponse n'est pas correcte.
const_get
etconst_defined
look pour un nom de constante, indépendamment de l'objet appelant la méthode. Par exemple, si je voulais vérifier pourMyModule::Rails
à l'intérieur d'une application Rails, à l'aide deconst_get
serait de retour à la normale Rails module.Pour vérifier une constante au sein d'un espace de noms spécifique, utilisez la
constants
méthode et de vérifier votre classe:instance_methods
etc.,const_defined?
comprend un deuxième paramètre detrue
(par défaut, l'héritage est pris en compte) etfalse
(seulement de rechercher sur le récepteur). Je pense que je préfère utiliser que même si c'est un peu ambigu propriété booléenne, car il ya une bonne chance que l'interpréteur Ruby aura une plus optimisé de la recherche que de la création d'un Rubis tableau viaconstants
et de demander à Ruby de recherche avecinclude?
.