Section 5.1

Rendre une valeur

Une flèche, un return, et l'appel cesse d'être une simple action pour devenir une valeur.

Une méthode peut rendre une valeur à qui l’appelle. Il lui faut deux choses : dire de quel type, et la rendre.

@entry(demarrer)
object MonProgramme {
    demarrer() {
        var plusGrand := self.maximum(a: 12, b: 7);

        Console.print(text: $"le plus grand : {plusGrand}");
        Console.print(text: $"et entre 3 et 9 : {self.maximum(a: 3, b: 9)}");
    }

    maximum(a: int, b: int) -> int {
        if (a > b) {
            return a;
        }

        return b;
    }
}

La flèche annonce, return livre

maximum(a: int, b: int) -> int {

La flèche -> suit la liste des paramètres et annonce le type de ce que la méthode rendra. Ici un int — le type que la section 2.3 recommande quand vous voulez simplement un entier.

return livre la valeur et quitte la méthode sur-le-champ. Ce qui suit dans le corps n’est pas exécuté. C’est pourquoi maximum n’a pas besoin de else : si a > b tient, le premier return part avec a et la dernière ligne n’est jamais atteinte.

Une méthode sans flèche ne rend rien, et c’est le cas de toutes celles écrites jusqu’ici — demarrer, saluer. Rien ne change pour elles. return y reste possible, seul et sans valeur : il sert alors à sortir plus tôt.

L’appel devient une valeur

C’est le vrai changement. Jusqu’ici un appel ne pouvait qu’agir ; il tenait une ligne à lui seul et c’était tout. Un appel qui rend une valeur se met partout où une valeur se met :

var plusGrand := self.maximum(a: 12, b: 7);
Console.print(text: $"et entre 3 et 9 : {self.maximum(a: 3, b: 9)}");

À droite d’un :=, dans un trou d’interpolation, comme argument d’un autre appel. Le programme peut enfin calculer ailleurs que dans demarrer et rapporter le résultat.

Il n’y a pas de fonction libre

Une méthode se déclare à l’intérieur d’un objet, jamais seule au niveau du fichier. C’est pour ça que maximum est écrite dans MonProgramme, entre les mêmes accolades que demarrer, et que demarrer l’appelle par self.maximum(…) — self désigne l’objet lui-même, comme la section 1.2.1 le notait en passant.

Aucun mot-clé ne déclare une méthode : un nom, des paramètres entre parenthèses, la flèche s’il y a lieu, un corps. C’est tout ce qui la distingue du reste.

À vous

  • Changez le premier appel en a: 12, b: 70 : la réponse suit, sans qu’on ait touché à maximum.
  • Glissez Console.print(text: "jamais"); juste après le premier return. Le programme tourne et n’affiche rien de neuf — mais le compilateur ne vous laisse pas croire que cette ligne compte : warning[W002]: unreachable statement: the previous one leaves the block.
  • Écrivez une méthode doubler(valeur: int) -> int qui rend valeur * 2, et affichez self.doubler(valeur: self.maximum(a: 12, b: 7)) — 24. Un appel qui rend une valeur peut nourrir un autre appel.