Bonjour. Dans cette séquence, nous allons parler du return.
Comment peut-on retourner une valeur d'un block ou d'une
méthode? Quelles sont les valeurs de retour par défaut?
Il y a 4 cas à étudier.
Une méthode qui utilise le chapeau pour faire un return,
une méthode qui n'utilise pas le chapeau pour faire un
return, un block qui utilise le chapeau pour faire un
return et un block qui n'utilise pas le chapeau pour faire un return.
Dans une méthode, si on utilise le chapeau pour retourner
une valeur, ici ce return
va retourner une valeur en particulier et va quitter
la méthode.
Si je ne mets pas le chapeau, par défaut la méthode à la fin retourne self.
Cette partie-là est optionnelle et en général on ne la mettra pas.
La valeur de retour d'un block est la valeur de sa dernière expression.
Dans le cadre de ce block là, entre ici et ici, j'ai un
block qui prend comme paramètre une valeur x.
J'ajoute 33 à x.
Le résultat de cette expression x plus 33 n'est pas
utilisé, donc est effacé et à l'instruction suivante, je
fais x plus 2, donc j'ajoute 2 à ma valeur x, et comme c'est
la dernière expression du bloc, sa valeur c'est
celle qui représentera la valeur de retour du block.
Mon block value: 5, ça ça veut dire j'exécute mon block
avec x prenant la valeur 5.
Donc je calcule 33 plus 5.
Le résultat de ce calcul est effacé, il ne sert à rien.
5 plus 2 me donne la valeur 7 qui est utilisée comme
valeur de retour du block.
Et donc l'ensemble de cette expression a pour valeur 7.
Si j'utilise le chapeau dans un block,
le comportement est complètement différent d'une méthode.
Ici, disons qu'on ne va pas s'attendre à ce que le block
se coupe, mais c'est la méthode qui va se couper.
Si je regarde l'exemple de la méthode factorielle dans la
classe Intenger, le return qui est
ici et celui qui est là, ces 2 return coupent l'exécution de la méthode.
Donc si self, si le receveur est égal à 0 lors de l'exécution
de la méthode factorielle, le block est exécuté et 1 est
retourné immédiatement et la méthode se coupe.
Donc, la méthode retourne 1.
Donc le return ne sert pas à couper le bloc mais à couper
la méthode qui englobe le block.
Dans le deuxième exemple, si self est plus grand que 0,
alors on calcule avec un appel récursif et on retourne le
résultat de cet appel immédiatement.
Donc la méthode ne continue pas à s'exécuter si self est plus grand que 0.
Dans les autres cas, si on arrive à la troisième
instruction, on lève une erreur ça veut dire que le
receveur est un nombre négatif.
Ce que vous devez retenir, c'est que le chapeau permet de
quitter la méthode, que le chapeau se trouve dans la
méthode ou dans un block qui se trouve dans la méthode,
le chapeau quitte systématiquement la méthode et retourne
une valeur spécifiée après le chapeau.
Par défaut, une méthode retourne self.
Mettre return self à la fin d'une méthode ne sert à rien
puisque c'est la valeur qui est retournée par défaut systématiquement.
Et un block retourne la valeur de sa dernière expression.