Tracks
/
Gleam
Gleam
/
Übungen
/
Sichere Schatztruhe
Sichere Schatztruhe

Sichere Schatztruhe

Lernübung

Einführung

Opaque-Typen

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.

Anleitung

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.

1. Definiere den opaken Typ TreasureChest.

Der TreasureChest enthält zwei Felder:

  • Ein Passwort, das ein String ist.
  • Einen Schatz von einem generischen Typ.

Der Typ TreasureChest muss opak sein.

2. Definiere die Funktion create.

Diese Funktion nimmt zwei Argumente entgegen:

  • Ein Passwort vom Typ String.
  • Einen Schatzwert beliebigen Typs.

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.

3. Definiere die Funktion open.

Diese Funktion nimmt zwei Argumente entgegen:

  • Einen TreasureChest.
  • Ein Passwort vom Typ 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.

Über GitHub bearbeiten Der Link öffnet sich in einem neuen Fenster oder Tab
Gleam Exercism

Bereit, mit Sichere Schatztruhe zu starten?

Melde dich bei Exercism an, um Gleam mit 33 Konzepte122 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.