Opaque-Typen in Gleam sind benutzerdefinierte Typen. Nur das Modul, das den Typ definiert, kann Werte dieses Typs konstruieren oder per Mustervergleich abgleichen. Das ist nützlich, um Typen zu erstellen, die nur auf eine bestimmte Weise verwendet werden sollten.
Opaque-Typen werden mit dem Schlüsselwort opaque definiert.
pub opaque type PositiveInt {
PositiveInt(inner: Int)
}
Dieser PositiveInt-Typ soll in Situationen verwendet werden, in denen eine Ganzzahl gewünscht ist, aber sie muss null oder größer sein. Ein normales Gleam-Int könnte nicht verwendet werden, da sie auch negativ sein können.
Das Modul, das diesen Typ definiert, kann eine Funktion definieren, um den inneren Ganzzahlwert zu erhalten, und eine Funktion zum Erstellen des PositiveInt-Typs, die einen Fehler zurückgibt, wenn der Wert nicht positiv ist.
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
}
Mit dieser API können andere Module keinen PositiveInt mit einem negativen Wert konstruieren, sodass jede Funktion, die einen PositiveInt entgegennimmt, sicher sein kann, dass der Wert positiv ist.
Genau hingeschaut: Wer aufmerksam gelesen hat, dem wird aufgefallen sein, dass der Typ TreasureChest in der vorherigen Übung nicht besonders sicher war!
Wenn du die Funktion get_treasure benutzt hast, musstest du das Passwort angeben. Du konntest den Typ TreasureChest aber trotzdem destrukturieren und so an den Schatz kommen, ohne das Passwort zu kennen.
Das beheben wir mit einem opaken Typ.
TreasureChest.Der TreasureChest enthält zwei Felder:
String ist.Der Typ TreasureChest muss opak sein.
create.Diese Funktion nimmt zwei Argumente entgegen:
String.Die Funktion gibt einen TreasureChest zurück, der das Passwort und den Wert enthält.
Wenn das Passwort kürzer als 8 Zeichen ist, soll die Funktion einen Fehler mit dem Text Password must be at least 8 characters long zurückgeben.
open.Diese Funktion nimmt zwei Argumente entgegen:
TreasureChest.String.Wenn das Passwort mit dem Passwort im TreasureChest übereinstimmt, soll die Funktion den Schatz zurückgeben, andernfalls einen Fehler mit dem Text Incorrect password.
Melde dich bei Exercism an, um Gleam mit 33 Konzepte122 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.