Section 2.2

Montrer une valeur

L'interpolation — glisser une expression dans un texte, sans rien assembler à la main.

La sous-section précédente a assemblé une phrase à coups de +, et l’a trouvée lourde. Voici l’écriture plus légère qu’elle annonçait — et elle règle du même coup une question qu’on n’avait pas encore posée : Console.print n’accepte qu’un texte, alors comment montrer un nombre ?

En glissant la valeur dans le texte, à l’endroit où elle doit paraître.

@entry(demarrer)
object MonProgramme {
    demarrer() {
        var nom := "Simon Magus";
        var age := 42;
        var taille := 1.83;
        var inscrit := true;

        Console.print(text: $"{nom}, {age} ans, {taille} m");
        Console.print(text: $"inscrit : {inscrit}");
        Console.print(text: $"dans dix ans : {age + 10} ans");
    }
}

Trois lignes en sortie, et pas une conversion écrite à la main.

$"…" — un texte à trous

Un texte préfixé d’un $ n’est plus un texte ordinaire : ce qu’il porte entre accolades est une expression, évaluée et insérée à sa place.

$"{nom}, {age} ans, {taille} m"

Trois trous, trois valeurs, et trois types différents — un texte, un entier, un flottant. Vous n’avez rien eu à convertir : c’est le compilateur qui s’en charge, et il sait de quel type est chaque trou parce qu’il connaît déjà le type de chaque variable.

Le sigle $ a été choisi parce qu’il était libre. Il n’était employé nulle part ailleurs dans le langage — le compilateur le refusait même comme caractère invalide. Il n’y avait donc aucune ambiguïté à lever pour lui donner ce rôle, contrairement à la forme f"…" de Python, où f est un nom valide comme un autre.

N’importe quelle expression, pas seulement un nom

Un trou n’est pas limité à une variable. Tout ce qui produit une valeur y tient :

$"dans dix ans : {age + 10} ans"

Le calcul se fait à l’endroit où on lit son résultat — pas trois lignes plus haut dans une variable qui ne sert qu’à ça.

Ce que cela remplace

Reprenez le + de la sous-section précédente et essayez d’y glisser un nombre : ça ne suffit plus. Coller deux textes marchait ; coller un texte et un entier demande d’abord de convertir l’entier en texte.

Console.print(text: nom + ", " + age.toText() + " ans");

Cette écriture existe, et vous la rencontrerez — mais .toText() n’est pas offert par défaut : il faut le demander, ce qui se voit en tête de fichier. On y viendra quand le besoin s’en fera sentir.

L’interpolation évite les deux corvées d’un coup : rien à coller, rien à convertir, et la phrase se lit dans l’ordre où elle sortira.

À vous

  • Ajoutez une ligne qui montre la taille en centimètres : {taille * 100}.
  • Mettez un texte entier dans un trou : $"{"bonjour"}". Ça marche, et ça n’a aucun intérêt — mais ça dit bien qu’un trou reçoit une expression, pas un nom de variable.
  • Retirez le $ devant un des textes et exécutez : les accolades redeviennent des accolades, et s’affichent telles quelles.