A Gleamben az opaque típusok olyan egyedi típusok, amelyek értékeit csak az a modul hozhatja létre vagy illeszthet rájuk mintát, amelyik magát a típust definiálja. Ez akkor hasznos, ha olyan típusokat szeretnénk létrehozni, amelyeket csak egy meghatározott módon szabad használni.
Az opaque típusokat az opaque kulcsszóval definiáljuk.
pub opaque type PositiveInt {
PositiveInt(inner: Int)
}
Ezt a PositiveInt típust olyan helyzetekben érdemes használni, ahol egy egész számra van szükség, de annak nullának vagy nagyobbnak kell lennie. Egy sima Gleam Int nem lenne jó erre, mert az negatív is lehet.
Az a modul, amelyik definiálja ezt a típust, definiálhat egy függvényt a benne tárolt egész szám értékének kiolvasására, és egy függvényt a PositiveInt típus létrehozására, amely hibát ad vissza, ha az érték nem pozitív.
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
}
Ezzel az API-val más modulok nem hozhatnak létre negatív értékű PositiveInt-et, így minden függvény, amelyik PositiveInt-et kap, biztos lehet benne, hogy az érték pozitív.
A szemfüles tanulók biztosan észrevették, hogy az előző feladatban szereplő TreasureChest típus nem volt annyira biztonságos!
Ha a get_treasure függvényt használtad, meg kellett adnod a jelszót, de a TreasureChest típust továbbra is destrukturálhattad, hogy megszerezd a kincset anélkül, hogy ismernéd a jelszót.
Ezt egy opaque típus segítségével javítsuk ki.
TreasureChest opaque típust.A TreasureChest két mezőt tartalmaz:
String.A TreasureChest típus legyen opaque.
create függvényt.Ez a függvény két argumentumot vár:
String típusú jelszót.A függvény egy TreasureChest értéket ad vissza, amely tartalmazza a jelszót és az értéket.
Ha a jelszó rövidebb 8 karakternél, akkor a függvény adjon vissza egy hibát a következő üzenettel: Password must be at least 8 characters long.
open függvényt.Ez a függvény két argumentumot vár:
TreasureChest értéket.String típusú jelszót.Ha a jelszó megegyezik a TreasureChest-ben tárolt jelszóval, akkor a függvény adja vissza a kincset, ellenkező esetben pedig adjon vissza egy hibát a következő üzenettel: Incorrect password.
Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) Gleam nyelvet 33 fogalom122 feladat segítségével, valódi emberi mentorálással, mindez ingyen.