Οι αδιαφανείς τύποι στη 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 για να πάρεις τον θησαυρό χωρίς να χρειάζεται να ξέρεις τον κωδικό πρόσβασης.
Ας το διορθώσουμε αυτό χρησιμοποιώντας έναν αδιαφανή τύπο.
TreasureChest.Ο τύπος TreasureChest περιέχει δύο πεδία:
String.Ο τύπος TreasureChest πρέπει να είναι αδιαφανής.
create.Αυτή η συνάρτηση παίρνει δύο ορίσματα:
String.Η συνάρτηση επιστρέφει ένα TreasureChest που περιέχει τον κωδικό πρόσβασης και την τιμή.
Αν ο κωδικός πρόσβασης είναι μικρότερος από 8 χαρακτήρες, τότε η συνάρτηση θα πρέπει να επιστρέψει ένα σφάλμα που λέει Password must be at least 8 characters long.
open.Αυτή η συνάρτηση παίρνει δύο ορίσματα:
TreasureChest.String.Αν ο κωδικός πρόσβασης ταιριάζει με τον κωδικό πρόσβασης μέσα στο TreasureChest, τότε η συνάρτηση θα πρέπει να επιστρέψει τον θησαυρό, αλλιώς θα πρέπει να επιστρέψει ένα σφάλμα που λέει Incorrect password.
Γράψου στο Exercism για να μάθεις και να κατακτήσεις Gleam με 33 έννοιες122 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.