En Gleam, les types opaques sont des types personnalisés pour lesquels seul le module qui définit le type peut construire des valeurs de ce type ou les utiliser dans un filtrage par motif. C'est utile pour créer des types qui ne doivent être utilisés que d'une manière bien précise.
Les types opaques se définissent à l'aide du mot-clé opaque.
pub opaque type PositiveInt {
PositiveInt(inner: Int)
}
Ce type PositiveInt est destiné aux situations où l'on veut un entier, mais où celui-ci doit être supérieur ou égal à zéro. Un Int Gleam ordinaire ne conviendrait pas, car il peut aussi être négatif.
Le module qui définit ce type peut définir une fonction pour récupérer la valeur entière interne, et une fonction pour créer le type PositiveInt, qui renverra une erreur si la valeur n'est pas positive.
pub fn from_int(i: Int) -> Result(PositiveInt, String) {
case i {
_ if i < 0 -> Error("Value must be positive")
_ -> Ok(PositiveInt(i))
}
}
pub fn to_int(i: PositiveInt) -> Int {
i.inner
}
Avec cette API, les autres modules ne peuvent pas construire un PositiveInt avec une valeur négative, donc toute fonction qui prend un PositiveInt peut être sûre que la valeur est positive.
Les apprenants les plus observateurs auront remarqué que le type TreasureChest de l'exercice précédent n'était pas si sécurisé que ça !
Si tu utilisais la fonction get_treasure, tu devais fournir le mot de passe, mais tu pouvais quand même déstructurer le type TreasureChest pour récupérer le trésor sans avoir à connaître le mot de passe.
Corrigeons cela en utilisant un type opaque.
TreasureChest.Le TreasureChest contient deux champs :
String.Le type TreasureChest doit être opaque.
create.Cette fonction prend deux arguments :
String.La fonction renvoie un TreasureChest contenant le mot de passe et la valeur.
Si le mot de passe fait moins de 8 caractères, la fonction doit renvoyer une erreur indiquant Password must be at least 8 characters long.
open.Cette fonction prend deux arguments :
TreasureChest.String.Si le mot de passe correspond à celui du TreasureChest, la fonction doit renvoyer le trésor ; sinon, elle doit renvoyer une erreur indiquant Incorrect password.
Inscris-toi sur Exercism pour apprendre et maîtriser Gleam avec 33 concepts122 exercices, et un vrai mentorat humain, le tout gratuitement.