Tous les chemins doivent rendre
Une méthode qui annonce un type de retour doit le tenir partout, et les trois façons d'oublier un chemin.
Une méthode qui déclare un type de retour doit rendre une valeur par tous ses chemins. Aucune exception.
@entry(demarrer)
object MonProgramme {
demarrer() {
Console.print(text: self.nommer(jour: 2));
Console.print(text: self.nommer(jour: 7));
}
nommer(jour: int) -> str {
switch (jour) {
case 1:
return "lundi";
case 2:
return "mardi";
default:
return "un autre jour";
}
}
}
Trois case, trois return, et le default qui répond pour tout le reste. Aucun chemin ne
sort du corps sans avoir rendu quelque chose.
Ce qui se passe si vous en oubliez un
Retirez le default et ses deux lignes, puis exécutez :
error[D012]: 'nommer' returns 'str', but a path reaches the end of the body
without 'return' or 'throw': it would yield 0, which this language reads as absence
Le compilateur ne s’est pas contenté de constater : il dit ce qui arriverait. Sans default, un
jour valant 7 traverse le switch sans rien trouver, atteint la fin du corps, et il faudrait
bien rendre quelque chose.
Les trois façons d’ouvrir un chemin
Elles vous sont toutes familières, et c’est le moment de les relire ensemble :
- un
ifsanselse(section 3.2) — quand la condition est fausse, le corps se termine ; - un
switchsansdefault(section 4.4) — quand aucuncasene correspond ; - une boucle dont la condition peut être fausse (section 4.1) — si le corps ne s’exécute
aucune fois, un
returnposé dedans ne part jamais.
Un return à l’intérieur d’une de ces trois constructions ne compte donc jamais pour la méthode
entière. Il faut toujours se demander ce qu’il advient quand on n’y entre pas.
throw termine aussi bien que return : une méthode qui finit par lever est complète. Ce
mot-clé est présenté à la section 8.
À vous
- Retirez le
defaultet lisez le diagnostic en entier. - Remplacez le
defaultpar unreturn "un autre jour";posé après leswitch, hors de ses accolades : la méthode redevient complète, autrement. - Écrivez
estPair(valeur: int) -> boolavec un seulif (valeur % 2 = 0) { return true; }, sans rien après. Le refus tombe, et vous saurez le lire.