Tipos opacos em Gleam são tipos personalizados em que apenas o módulo que define o tipo pode construir valores desse tipo ou fazer correspondência de padrões com eles. Isso é útil para criar tipos que só devem ser usados de uma forma específica.
Os tipos opacos são definidos com a palavra-chave opaque.
pub opaque type PositiveInt {
PositiveInt(inner: Int)
}
Esse tipo PositiveInt deve ser usado em situações em que se quer um int, mas ele precisa ser maior ou igual a zero. Um Int comum do Gleam não poderia ser usado, já que os Int também podem ser negativos.
O módulo que define esse tipo pode definir uma função para obter o valor int interno e uma função para criar o tipo PositiveInt, que retorna um erro se o valor não for positivo.
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
}
Com essa API, outros módulos não conseguem construir um PositiveInt com valor negativo, então qualquer função que receba um PositiveInt pode ter certeza de que o valor é positivo.
Quem prestou atenção deve ter notado que o tipo TreasureChest do exercício anterior não era tão seguro assim!
Se você usou a função get_treasure, precisava fornecer a senha, mas ainda podia desestruturar o tipo TreasureChest para obter o tesouro sem precisar saber a senha.
Vamos corrigir isso usando um tipo opaco.
TreasureChest.O TreasureChest contém dois campos:
String.O tipo TreasureChest deve ser opaco.
create.Essa função recebe dois argumentos:
String.A função retorna um TreasureChest contendo a senha e o valor.
Se a senha tiver menos de 8 caracteres, a função deve retornar um erro dizendo Password must be at least 8 characters long.
open.Essa função recebe dois argumentos:
TreasureChest.String.Se a senha corresponder à senha do TreasureChest, a função deve retornar o tesouro; caso contrário, deve retornar um erro dizendo Incorrect password.
Crie sua conta no Exercism para aprender e dominar Gleam com 33 conceitos122 exercícios e mentoria humana de verdade, tudo de graça.