Kurzusok
/
Gleam
Gleam
/
Feladatok
/
Biztonságos kincsesláda
Biztonságos kincsesláda

Biztonságos kincsesláda

Tanulófeladat

Bevezetés

Opaque típusok

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.

Utasítások

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.

1. Definiáld a TreasureChest opaque típust.

A TreasureChest két mezőt tartalmaz:

  • Egy jelszót, ami egy String.
  • Egy kincset, ami egy generikus típus.

A TreasureChest típus legyen opaque.

2. Definiáld a create függvényt.

Ez a függvény két argumentumot vár:

  • Egy String típusú jelszót.
  • Egy bármilyen típusú kincset.

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.

3. Definiáld az open függvényt.

Ez a függvény két argumentumot vár:

  • Egy TreasureChest értéket.
  • Egy 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.

Szerkesztés GitHubon A hivatkozás új ablakban vagy lapon nyílik meg
Gleam Exercism

Készen állsz elkezdeni a(z) Biztonságos kincsesláda feladatot?

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.