Valeurs optionnelles
Optional of T distingue explicitement une valeur présente d'une valeur
absente. Une adresse absente, un texte vide et une adresse renseignée ne sont
pas le même état métier.
Construire et lire une valeur
module examples.contacts
function FirstContact
takes contacts as List of Optional of Text
gives Optional of Text
do
for contact in contacts
if present contact as address
if address != ""
give some(address)
give none(Text)
some(address) construit une valeur présente. none(Text) construit une
absence dont le type reste explicite. if present rend address accessible
uniquement dans la branche de présence. Il n'autorise pas un accès à une
valeur absente.
Le premier give rencontré quitte la fonction. Si la liste ne contient
aucune adresse non vide, la fonction retourne une absence, pas un texte
inventé.
Représentation JSON
| Valeur Touba | Argument ou résultat JSON |
|---|---|
none(Text) | {"present":false} |
some("") | {"present":true,"value":""} |
some("a@example.test") | {"present":true,"value":"a@example.test"} |
null, une chaîne seule et un champ requis omis ne remplacent pas cette
enveloppe. Le runtime vérifie la présence et le type de la valeur contenue.
Un champ déclaré Optional of T conserve donc sa place dans le record JSON ;
son absence métier est portée par present: false.
Usages et limites
Les optionnels se composent avec les listes, records et
énumérations. Préférez un test de présence à une valeur
sentinelle comme -1 ou "unknown" lorsque le domaine ne donne pas un sens
propre à cette valeur.
Il n'y a ni déballage implicite, ni conversion automatique vers Text, ni
égalité globale des enveloppes optionnelles. Testez la présence, puis traitez
la valeur dans sa branche.
Pour un parcours complet, suivez Classer des tickets typés.