« Programmation Ruby/Méthodes » : différence entre les versions

Un livre de Wikilivres.
Contenu supprimé Contenu ajouté
→‎Méthodes de l'instance : clarifie l'exemple
Formulation + ortho + <source>
Ligne 12 : Ligne 12 :


== initialize ==
== initialize ==
La méthode initialize par exemple est la méthode appellée lorsqu'une instance est crée via la méthode new :
La méthode <tt>initialize</tt>, par exemple, est la méthode appelée lorsqu'une instance est créée via la méthode <tt>new</tt> :


<source lang="ruby">
class Point
class Point
def initialize ( x, y )
@x = x
def initialize ( x, y )
@y = y
@x = x
end
@y = y
def coords
end
def coords
puts "x : #{@x}"
puts "x : #{@x}"
puts "y : #{@y}"
puts "y : #{@y}"
end
end
end
end
</source>


Ici la méthode initialize définie les variable d'instances @x et @y en fonction des paramètres passés à la fonction new.
Ici la méthode <tt>initialize</tt> définie les variable d'instances @x et @y en fonction des paramètres passés à la fonction <tt>new</tt>.


Si par exemple on initialise cette classe comme suit :
Si par exemple on initialise un objet comme suit :
<source lang="ruby">
p = Point.new(2,3)
p = Point.new(2,3)

@x = 2 et @y = 3
# -> @x = 2 et @y = 3
</source>


== Valeurs par défaut ==
== Valeurs par défaut ==
On peut en Ruby donner des valeurs par défaut aux méthodes.
On peut en Ruby donner des valeurs par défaut aux arguments des méthodes.
<source lang="ruby">
class Parle
class Parle
def initialize ( nom = "vous" )
@qui = nom
def initialize ( nom = "vous" )
end
@qui = nom
def bonjour
end
def bonjour
puts "Bonjour #{@qui}"
puts "Bonjour #{@qui}"
end
end
end
end
</source>


Si l'on crée la méthode sans argument, la valeur par defaut est assigné à la variable d'instance @qui
Si l'on appelle la méthode sans argument, la valeur par défaut est assigné à la variable d'instance <tt>@qui</tt>
<source lang="ruby">
dit = Parle.new
dit = Parle.new
dit.bonjour
dit.bonjour
=> Bonjour vous
Si l'on crée la méthode avec un argument, celui-ci remplacera la valeur par défaut :
# => Bonjour vous
</source>
Si l'on appelle la méthode avec un argument, celui-ci remplacera la valeur par défaut :
<source lang="ruby">
dit2 = Parle.new("Roger")
dit2 = Parle.new("Roger")
dit2.bonjour
dit2.bonjour
=> Bonjour Roger
# => Bonjour Roger
</source>


== Méthodes de l'instance ==
== Méthodes de l'instance ==
La méthode générique, présente dans toutes les classe, ''instance_methods'' renvoie la liste des méthodes existantes.
La méthode générique, présente dans toutes les classes, <tt>instance_methods</tt> renvoie la liste des méthodes existantes.
<source lang="ruby">
Parle.instance_methodes
Parle.instance_methodes
=> ["bonjour", "method", "instance_variables", "__id__", "to_s", "send", "object_id", "dup", "private_methods",
"=~", "is_a?", "class", "tainted?", "singleton_methods", "eql?", "untaint", "instance_of?", "id",
# => ["bonjour", "method", "instance_variables", "__id__", "to_s", "send", "object_id", "dup", "private_methods",
"instance_variable_get", "inspect", "instance_eval", "extend", "nil?", "__send__", "frozen?", "taint",
# "=~", "is_a?", "class", "tainted?", "singleton_methods", "eql?", "untaint", "instance_of?", "id",
"instance_variable_defined?", "public_methods", "hash", "to_a", "clone", "protected_methods", "respond_to?",
# "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"]
# "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.
</source>


Cette liste contient l'ensemble des méthodes existant par défaut, plus celle qui ont été créées.
On peut obtenir une liste réstreintes au fonctions que l'on a crée en remplacant le true (vrai, valeur par défaut) par un false (faux) :
Parle.instance_methods(false)
=> ["bonjour"]


On peut obtenir une liste restreinte aux fonctions que l'on a crée en remplaçant l'argument <tt>true</tt> (vrai, valeur par défaut) par <tt>false</tt> (faux) :
Au contraire on peut obtenir les méthodes qui ne sont pas que des méthodes d'instances :
<source lang="ruby">
Parle.methods
Parle.instance_methods(false)
=> ["inspect", "private_class_method", "const_missing", "clone", "method", "public_methods",
# => ["bonjour"]
"public_instance_methods", "instance_variable_defined?", "method_defined?", "superclass", "equal?", "freeze",
</source>
"included_modules", "const_get", "methods", "respond_to?", "module_eval", "class_variables", "dup",

"protected_instance_methods", "instance_variables", "public_method_defined?", "__id__", "eql?", "object_id",
Au contraire, on peut obtenir les méthodes qui ne sont pas que des méthodes d'instances :
"const_set", "id", "singleton_methods", "send", "class_eval", "taint", "frozen?", "instance_variable_get",
<source lang="ruby">
"include?", "private_instance_methods", "__send__", "instance_of?", "private_method_defined?", "to_a", "name",
Parle.methods
"autoload", "type", "new", "<", "protected_methods", "instance_eval", "<=>", "display", "==", ">", "===",
# => ["inspect", "private_class_method", "const_missing", "clone", "method", "public_methods",
"instance_method", "instance_variable_set", "kind_of?", "extend", "protected_method_defined?", "const_defined?",
# "public_instance_methods", "instance_variable_defined?", "method_defined?", "superclass", "equal?", "freeze",
">=", "ancestors", "to_s", "<=", "public_class_method", "allocate", "hash", "class", "instance_methods",
"tainted?", "=~", "private_methods", "class_variable_defined?", "nil?", "untaint", "constants", "is_a?",
# "included_modules", "const_get", "methods", "respond_to?", "module_eval", "class_variables", "dup",
# "protected_instance_methods", "instance_variables", "public_method_defined?", "__id__", "eql?", "object_id",
"autoload?"]
# "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?"]
</source>


=== Classe de l'instance ===
=== Classe de l'instance ===
La methode type permet de connaitre le type, donc la classe utilisé par l'instance :
La méthode <tt>type</tt> permet de connaître le type (donc la classe) utilisé par l'instance :
<source lang="ruby">
dit = Parle.new
dit.type
# => Parle
</source>


== Existence d'une méthode ==
dit = Parle.new
dit.type
=> Parle

== Existance d'une méthode ==
On peut déterminer si une méthode existe ou pas à l'aide des méthodes par défaut :
On peut déterminer si une méthode existe ou pas à l'aide des méthodes par défaut :
<source lang="ruby">
Parle.method_defined?("bonjour")
Parle.method_defined?("bonjour")
=> true
# => true
Parle.method_defined?("aurevoir")
Parle.method_defined?("aurevoir")
=> false
# => false
On peut également determiner si elle est publique (accessible depuis l'exterieure de la classe) :
</source>
Parle.public_method_defined?("bonjour")

=> true
On peut également déterminer si elle est publique (accessible en dehors de la classe) :
<source lang="ruby">
Parle.public_method_defined?("bonjour")
# => true
</source>


[[Catégorie:Programmation Ruby (livre)]]
[[Catégorie:Programmation Ruby (livre)]]

Version du 10 mai 2008 à 18:50

<< Retour au sommaire << Retour à programmation objet

En programmation objet, les méthodes sont les fonctions appartenant à une classe.

En Ruby, elle sont définies de la façon suivante :

def <nom de la méthode> (<arguments>)
  <bloc de code de la méthode>
end

Plusieurs méthodes sont prédéfinies dans toutes les classes.

initialize

La méthode initialize, par exemple, est la méthode appelée lorsqu'une instance est créée via la méthode new :

class Point
  def initialize ( x, y )
    @x = x
    @y = y
  end
  def coords
    puts "x : #{@x}"
    puts "y : #{@y}"
  end
end

Ici la méthode initialize définie les variable d'instances @x et @y en fonction des paramètres passés à la fonction new.

Si par exemple on initialise un objet comme suit :

p = Point.new(2,3)
# -> @x = 2 et @y = 3

Valeurs par défaut

On peut en Ruby donner des valeurs par défaut aux arguments des méthodes.

class Parle
  def initialize ( nom = "vous" )
    @qui = nom
  end
  def bonjour
    puts "Bonjour #{@qui}"
  end
end

Si l'on appelle la méthode sans argument, la valeur par défaut est assigné à la variable d'instance @qui

dit = Parle.new
dit.bonjour
#                    => Bonjour vous

Si l'on appelle la méthode avec un argument, celui-ci remplacera la valeur par défaut :

dit2 = Parle.new("Roger")
dit2.bonjour
#                    => Bonjour Roger

Méthodes de l'instance

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

Parle.instance_methodes
# => ["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ée 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

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

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