Kurzusok
/
Elixir
Elixir
/
Tanterv
/
Típusspecifikációk
Tí

Típusspecifikációk ebben a kurzusban: Elixir

1 feladat

A(z) Típusspecifikációk fogalomról

Az Elixir dinamikusan típusos nyelv, ami azt jelenti, hogy nem biztosít fordítási idejű típusellenőrzést. A típusspecifikációk ennek ellenére is hasznosak lehetnek, mert:

  • Dokumentációként szolgálnak.
  • Olyan statikus elemzőeszközök használhatják őket, mint a Dialyzer, hogy megtalálják a lehetséges hibákat.

Egy típusspecifikációt a @spec modulattribútummal adhatsz meg egy függvényhez, közvetlenül a függvény definíciója előtt.

@spec longer_than?(String.t(), non_neg_integer()) :: boolean()
def longer_than?(string, length), do: String.length(string) > length

Típusok

A típusspecifikációban engedélyezett kifejezések:

  • Alaptípusok, például:

    • boolean()
    • integer(), non_neg_integer(), pos_integer(), float()
    • list()
    • map()
    • any()
  • Típusok uniója:

    • pl. integer() | list(integer())
  • Paraméterezett típusok:

    • pl. list(integer()) - egész számok listája
    • pl. %{age: integer()} - map egész értékkel a :age kulcs alatt
  • Távoli típusok (valamely modulban definiálva), például:

  • Literálok, például:

    • %{} - üres map
    • [] - üres lista (de a [any()] nem üres lista)
    • pl. :ok - atomliterál
  • Beépített speciális típusok, például:

    • char() - egész szám a 0..0x10FFFF tartományból
    • charlist() - karakterek listája
    • keyword() - kételemű tuple-ök listája, ahol az első elem egy atom
  • Egyedi típusok

Az összes típus teljes listája a hivatalos dokumentáció „Typespecs” szakaszában található.

Az argumentumok elnevezése

A típusspecifikációban az argumentumokat el is nevezheted, ami hasznos, ha több azonos típusú argumentumot akarsz megkülönböztetni.

@spec to_hex({hue :: integer, saturation :: integer, lightness :: integer}) :: String.t()

Egyedi típusok

Az egyedi típusok a három modulattribútum egyikével definiálhatók:

  • @type - nyilvános típust definiál
  • @typep - privát típust definiál
  • @opaque - nyilvános típust definiál, amelynek a szerkezete privát
@type color :: {hue :: integer, saturation :: integer, lightness :: integer}

@spec to_hex(color()) :: String.t()

String.t() vs binary() vs string()

A String.t() a helyes típus az Elixir stringekhez, amelyek UTF-8-kódolású binárisok. Technikailag a String.t() egy binary()-ként van definiálva, és az elemzőeszközök számára ez a két típus egyenértékű, de az Elixir stringekkel dolgozó függvények dokumentálásához a String.t() az, ami jobban kifejezi a szándékot.

A string() viszont egy másik típus. Ez egy Erlang string, amelyet az Elixirben charlistként ismerünk. A string() típust kerülni kell a típusspecifikációkban, helyette a charlist()-et használd.

Dialyzer

A Dialyzer egy statikus elemzőeszköz, amely képes felismerni olyan problémákat, mint a típushibák az Erlang- és Elixir-kódban. A Dialyzer használatának legegyszerűbb módja egy Elixir-projektben a Dialyxir.

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

Tanuld meg a(z) Típusspecifikációk fogalmat