Section 5.2

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 if sans else (section 3.2) — quand la condition est fausse, le corps se termine ;
  • un switch sans default (section 4.4) — quand aucun case ne correspond ;
  • une boucle dont la condition peut être fausse (section 4.1) — si le corps ne s’exécute aucune fois, un return posé 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 default et lisez le diagnostic en entier.
  • Remplacez le default par un return "un autre jour"; posé après le switch, hors de ses accolades : la méthode redevient complète, autrement.
  • Écrivez estPair(valeur: int) -> bool avec un seul if (valeur % 2 = 0) { return true; }, sans rien après. Le refus tombe, et vous saurez le lire.