Programmation Ruby/Réflexion

Un livre de Wikilivres.


Méthodes de l'instance[modifier | modifier le wikicode]

La méthode générique, présente dans toutes les classes, instance_methods renvoie la liste des méthodes existantes.

Parle.instance_methods
# => ["bonjour", "method", "instance_variables", "__id__", "to_s", "send", "object_id", "dup", "private_methods",
# "=~", "is_a?", "class", "tainted?", "singleton_methods", "eql?", "untaint", "instance_of?", "id",
# "instance_variable_get", "inspect", "instance_eval", "extend", "nil?", "__send__", "frozen?", "taint",
# "instance_variable_defined?", "public_methods", "hash", "to_a", "clone", "protected_methods", "respond_to?",
# "display", "freeze", "kind_of?", "==", "instance_variable_set", "type", "===", "equal?", "methods"]

Cette liste contient l'ensemble des méthodes existant par défaut, plus celle qui ont été créées.

On peut obtenir une liste restreinte aux fonctions que l'on a créées en remplaçant l'argument true (vrai, valeur par défaut) par false (faux) :

Parle.instance_methods(false)
# => ["bonjour"]

Au contraire, on peut obtenir les méthodes qui ne sont pas que des méthodes d'instances :

Parle.methods
# => ["inspect", "private_class_method", "const_missing", "clone", "method", "public_methods",
# "public_instance_methods", "instance_variable_defined?", "method_defined?", "superclass", "equal?", "freeze",
# "included_modules", "const_get", "methods", "respond_to?", "module_eval", "class_variables", "dup",
# "protected_instance_methods", "instance_variables", "public_method_defined?", "__id__", "eql?", "object_id",
# "const_set", "id", "singleton_methods", "send", "class_eval", "taint", "frozen?", "instance_variable_get",
# "include?", "private_instance_methods", "__send__", "instance_of?", "private_method_defined?", "to_a", "name",
# "autoload", "type", "new", "<", "protected_methods", "instance_eval", "<=>", "display", "==", ">", "===",
# "instance_method", "instance_variable_set", "kind_of?", "extend", "protected_method_defined?", "const_defined?",
# ">=", "ancestors", "to_s", "<=", "public_class_method", "allocate", "hash", "class", "instance_methods",
# "tainted?", "=~", "private_methods", "class_variable_defined?", "nil?", "untaint", "constants", "is_a?",
# "autoload?"]

Classe de l'instance[modifier | modifier le wikicode]

La méthode type permet de connaître le type (donc la classe) utilisé par l'instance :

dit = Parle.new
dit.type
#      => Parle

Existence d'une méthode[modifier | modifier le wikicode]

On peut déterminer si une méthode existe ou pas à l'aide des méthodes par défaut :

Parle.method_defined?("bonjour")
# => true
Parle.method_defined?("aurevoir")
# => false

On peut également déterminer si elle est publique (accessible en dehors de la classe) :

Parle.public_method_defined?("bonjour")
# => true

Manipuler des contextes[modifier | modifier le wikicode]

L'objet Binding que l'on peut obtenir grâce à Kernel#binding.