Διαδρομές
/
Gleam
Gleam
/
Ασκήσεις
/
Ασφαλές σεντούκι θησαυρού
Ασφαλές σεντούκι θησαυρού

Ασφαλές σεντούκι θησαυρού

Άσκηση εκμάθησης

Εισαγωγή

Αδιαφανείς τύποι

Οι αδιαφανείς τύποι στη Gleam είναι προσαρμοσμένοι τύποι όπου μόνο η ενότητα που ορίζει τον τύπο μπορεί να κατασκευάσει τιμές του τύπου ή να κάνει αντιστοίχιση προτύπων σε αυτές. Αυτό είναι χρήσιμο για τη δημιουργία τύπων που πρέπει να χρησιμοποιούνται μόνο με έναν συγκεκριμένο τρόπο.

Οι αδιαφανείς τύποι ορίζονται με τη λέξη-κλειδί opaque.

pub opaque type PositiveInt {
  PositiveInt(inner: Int)
}

Αυτός ο τύπος PositiveInt προορίζεται για χρήση σε περιπτώσεις όπου χρειάζεται ένας ακέραιος, αλλά πρέπει να είναι μηδέν ή μεγαλύτερος. Ένας συνηθισμένος Int της Gleam δεν θα μπορούσε να χρησιμοποιηθεί, καθώς μπορεί να είναι και αρνητικός.

Η ενότητα που ορίζει αυτόν τον τύπο μπορεί να ορίσει μια συνάρτηση που παίρνει την εσωτερική ακέραια τιμή και μια συνάρτηση για τη δημιουργία του τύπου PositiveInt, η οποία θα επιστρέφει ένα σφάλμα αν η τιμή δεν είναι θετική.

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
}

Με αυτό το API, άλλες ενότητες δεν μπορούν να κατασκευάσουν ένα PositiveInt με αρνητική τιμή, οπότε οποιαδήποτε συνάρτηση που δέχεται ένα PositiveInt μπορεί να είναι σίγουρη ότι η τιμή είναι θετική.

Οδηγίες

Οι παρατηρητικοί μαθητές θα έχουν προσέξει ότι ο τύπος TreasureChest στην προηγούμενη άσκηση δεν ήταν και τόσο ασφαλής!

Αν χρησιμοποιούσες τη συνάρτηση get_treasure, έπρεπε να δώσεις τον κωδικό πρόσβασης, αλλά μπορούσες ακόμα να αποδομήσεις τον τύπο TreasureChest για να πάρεις τον θησαυρό χωρίς να χρειάζεται να ξέρεις τον κωδικό πρόσβασης.

Ας το διορθώσουμε αυτό χρησιμοποιώντας έναν αδιαφανή τύπο.

1. Όρισε τον αδιαφανή τύπο TreasureChest.

Ο τύπος TreasureChest περιέχει δύο πεδία:

  • Έναν κωδικό πρόσβασης που είναι String.
  • Έναν θησαυρό που είναι γενικού τύπου.

Ο τύπος TreasureChest πρέπει να είναι αδιαφανής.

2. Όρισε τη συνάρτηση create.

Αυτή η συνάρτηση παίρνει δύο ορίσματα:

  • Έναν κωδικό πρόσβασης String.
  • Μια τιμή θησαυρού οποιουδήποτε τύπου.

Η συνάρτηση επιστρέφει ένα TreasureChest που περιέχει τον κωδικό πρόσβασης και την τιμή.

Αν ο κωδικός πρόσβασης είναι μικρότερος από 8 χαρακτήρες, τότε η συνάρτηση θα πρέπει να επιστρέψει ένα σφάλμα που λέει Password must be at least 8 characters long.

3. Όρισε τη συνάρτηση open.

Αυτή η συνάρτηση παίρνει δύο ορίσματα:

  • Μια τιμή TreasureChest.
  • Έναν κωδικό πρόσβασης String.

Αν ο κωδικός πρόσβασης ταιριάζει με τον κωδικό πρόσβασης μέσα στο TreasureChest, τότε η συνάρτηση θα πρέπει να επιστρέψει τον θησαυρό, αλλιώς θα πρέπει να επιστρέψει ένα σφάλμα που λέει Incorrect password.

Επεξεργασία μέσω GitHub Ο σύνδεσμος ανοίγει σε νέο παράθυρο ή καρτέλα
Gleam Exercism

Έτοιμος να ξεκινήσεις την άσκηση Ασφαλές σεντούκι θησαυρού;

Γράψου στο Exercism για να μάθεις και να κατακτήσεις Gleam με 33 έννοιες122 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.