Os tipos opacos em Gleam são tipos personalizados em que só o módulo que define o tipo pode construir ou fazer correspondência de padrões sobre valores desse tipo. Isto é útil para criar tipos que só devem ser usados de uma forma específica.
Os tipos opacos definem-se com a palavra-chave opaque.
pub opaque type PositiveInt {
PositiveInt(inner: Int)
}
Este tipo PositiveInt deve ser usado em situações em que se quer um inteiro, mas em que este tem de ser zero ou maior. Não se poderia usar um Int normal de Gleam, uma vez que também pode ser negativo.
O módulo que define este tipo pode definir uma função para obter o valor inteiro interior e uma função para criar o tipo PositiveInt, que devolve 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 esta API, os outros módulos não podem construir um PositiveInt com um valor negativo, por isso qualquer função que aceite um PositiveInt pode ter a certeza de que o valor é positivo.
Os alunos mais atentos terão reparado que o tipo TreasureChest do exercício anterior não era assim tão seguro!
Se usaste a função get_treasure, tinhas de fornecer a palavra-passe, mas mesmo assim podias desestruturar o tipo TreasureChest para obter o tesouro sem precisares de saber a palavra-passe.
Vamos corrigir isso com um tipo opaco.
TreasureChest.O TreasureChest contém dois campos:
String.O tipo TreasureChest tem de ser opaco.
create.Esta função recebe dois argumentos:
String.A função devolve um TreasureChest que contém a palavra-passe e o valor.
Se a palavra-passe tiver menos de 8 carateres, a função deve devolver um erro com a mensagem Password must be at least 8 characters long.
open.Esta função recebe dois argumentos:
TreasureChest.String.Se a palavra-passe corresponder à palavra-passe do TreasureChest, a função deve devolver o tesouro; caso contrário, deve devolver um erro com a mensagem Incorrect password.
Inscreve-te no Exercism para aprenderes e dominares Gleam com 33 conceitos122 exercícios, e mentoria humana real, tudo grátis.