Menu

Liaisons let en Zero : nommer des valeurs avec let

Comment fonctionne let en Zero : déclarer des liaisons locales, l'inférence de types et les annotations explicites, et pourquoi Zero utilise une seule forme de liaison plutôt que plusieurs mots-clés.

Cette page contient des éditeurs exécutables — modifiez, exécutez et voyez la sortie instantanément.

Une seule façon de nommer une valeur

En Zero, vous donnez un nom à une valeur avec let :

let answer = 42

C'est toute la syntaxe. Pas de var, pas de const, pas de auto. Un seul mot-clé de liaison garde le langage petit — agents et humains l'apprennent une fois et l'appliquent partout.

let introduit une liaison locale dans la portée courante. Après cette ligne, answer réfère à 42 jusqu'à la fin du bloc englobant.

Inférence de types

Le compilateur infère le type depuis le côté droit. Le littéral 42 est de type i32 par défaut, donc answer est un i32. Le littéral "hello" est une chaîne, donc :

let greeting = "hello"

lie greeting à une valeur de type chaîne. Si vous appelez une fonction qui retourne un Pair<i32, u8>, la liaison a le type Pair<i32, u8> :

let pair = makePair(40, 2_u8)

Vous n'avez pas à écrire le type sur chaque liaison, ce qui garde le code lisible.

Annotations de type explicites

Quand vous voulez documenter le type — ou en forcer un précis là où l'inférence en choisirait un autre — écrivez le type après deux points :

let count: u8 = 10
let pair:  Pair<i32, u8> = makePair(40, 2_u8)

Les annotations servent aussi d'indice au compilateur quand un littéral pourrait être de plusieurs types. Le littéral 10 pourrait être i32, i64, u8, etc. ; l'annotation tranche.

Vous verrez aussi des suffixes de type sur les littéraux comme alternative à l'annotation de la liaison :

let small = 10_u8   // u8 d'après le suffixe du littéral
let big   = 10_i64  // i64 d'après le suffixe du littéral

Les deux formes sont valides ; choisissez celle qui rend l'intention la plus claire sur le site d'appel.

Liaisons en action

Un exemple complet utilisant les deux formes, inférée et explicite — cliquez sur Run pour essayer :

point est annoté explicitement parce que le côté droit est un littéral de struct. total est inféré — sum est déclaré comme retournant i32, donc la liaison est i32 aussi.

Portée et masquage

Une liaison let est valide depuis la ligne qui la déclare jusqu'à la fin de son bloc englobant. Les blocs imbriqués créent de nouvelles portées :

pub fun main(world: World) -> Void raises {
    let value = 1
    if true {
        let value = 2   // masque le 'value' extérieur à l'intérieur de ce bloc
        // ici, value == 2
    }
    // de retour hors du if, value vaut à nouveau 1
}

Le value intérieur ne mute pas celui de l'extérieur — c'est une liaison distincte qui sort de portée à l'accolade fermante du bloc if. C'est le même modèle que celui de Rust et des langages de la famille ML. C'est particulièrement courant quand vous voulez transformer une valeur à travers une série d'étapes sans inventer un nouveau nom pour chaque résultat intermédiaire.

Ce que let ne fait pas

Quelques choses que vous pourriez attendre d'autres langages et que let ne propose délibérément pas :

  • Déclarations de type seules. Il n'y a pas de forme let x: i32; qui introduise une liaison non initialisée. Une liaison doit avoir une valeur au moment de sa déclaration.
  • Déstructuration par motifs (pour l'instant). Certains langages permettent d'écrire let (a, b) = pair. Zero est petit par conception et se concentre actuellement sur de simples liaisons de noms — vérifiez la doc actuelle pour savoir si la déstructuration a été ajoutée.
  • Plusieurs mots-clés pour des durées de vie différentes. Pas de static, const, let mut séparés, ni de variantes portée-bloc vs. portée-fonction. Un seul mot-clé.

Si votre bagage est JavaScript, l'analogie la plus proche est const — un nom lié à une valeur pour le reste du bloc, avec masquage dans les portées intérieures. Si votre bagage est Rust, let joue ici le même rôle que le let de Rust moins le mot-clé mut explicite.

Un pattern : construire une valeur étape par étape

Les liaisons brillent quand vous voulez écrire un calcul comme une série d'étapes intermédiaires nommées. C'est bon à la fois pour les humains qui lisent et pour les agents qui raisonnent localement sur chaque ligne :

Chaque ligne introduit un nouveau fait avec lequel le reste de la fonction peut travailler. Le compilateur produit toujours du code compact — nommer les valeurs intermédiaires n'a aucun coût à l'exécution.

La suite : les types primitifs

let ne sert pas à grand-chose sans quelque chose à lier. Le prochain document parcourt les types primitifs de Zero — les largeurs d'entiers, les flottants, les chaînes et les types Void et Bool que vous croiserez le plus souvent.

Questions fréquentes

Comment déclarer une variable en Zero ?

Utilisez let. La forme est let nom = valeur pour un type inféré, ou let nom: Type = valeur pour écrire le type explicitement. Par exemple : let answer = 42 ou let answer: i32 = 42. Les deux lient le nom answer à la valeur 42 dans la portée courante.

Zero infère-t-il les types des liaisons let ?

Oui. Si vous écrivez let total = sum(point) et que sum retourne un i32, le type de la liaison est inféré à i32. Vous pouvez toujours annoter explicitement quand vous voulez documenter le type ou en forcer un précis — par exemple let count: u8 = 10.

Les liaisons let sont-elles mutables en Zero ?

Un let simple introduit une liaison locale pour la portée courante. La gestion de la mutabilité dans Zero pré-1.0 évolue encore — le langage met l'accent sur les effets explicites et une mémoire prévisible, donc tout ce qui mute un état via une liaison doit le rendre visible. Vérifiez la doc Zero actuelle pour la syntaxe exacte de la mutabilité dans la version de votre chaîne d'outils.

Quelle est la différence entre let et const en Zero ?

Zero utilise let pour les liaisons locales ordinaires à l'intérieur des corps de fonctions. Il n'expose pas plusieurs mots-clés de liaison comme les let/const/var de JavaScript — garder la surface petite est un choix de conception délibéré. Les constantes à la compilation s'expriment typiquement à travers le système de types ou des déclarations de premier niveau, pas via un mot-clé séparé.

Peut-on redéclarer une liaison let en Zero ?

Les liaisons vivent dans leur portée englobante. Un nouveau let avec le même nom dans une portée imbriquée est une liaison distincte qui masque celle de l'extérieur pour la durée de la portée intérieure — la liaison extérieure n'est pas affectée une fois la portée intérieure terminée. C'est le même modèle que celui de Rust et des langages de la famille ML.

Coddy programming languages illustration

Apprendre à coder avec Coddy

COMMENCER