Ty

Typespecs σε Elixir

1 άσκηση

Σχετικά με την έννοια Typespecs

Η Elixir είναι μια δυναμικά τυποποιημένη γλώσσα, που σημαίνει ότι δεν παρέχει ελέγχους τύπων κατά τη μεταγλώττιση. Παρ' όλα αυτά, οι προδιαγραφές τύπων μπορούν να φανούν χρήσιμες επειδή:

  • Λειτουργούν ως τεκμηρίωση.
  • Μπορούν να χρησιμοποιηθούν από εργαλεία στατικής ανάλυσης όπως το Dialyzer για να βρουν πιθανά bugs.

Μια προδιαγραφή τύπων μπορεί να προστεθεί σε μια συνάρτηση χρησιμοποιώντας το χαρακτηριστικό module @spec αμέσως πριν από τον ορισμό της συνάρτησης.

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

Τύποι

Εκφράσεις που επιτρέπονται σε μια προδιαγραφή τύπων:

  • Βασικοί τύποι, για παράδειγμα:

    • boolean()
    • integer(), non_neg_integer(), pos_integer(), float()
    • list()
    • map()
    • any()
  • Μια ένωση τύπων:

    • π.χ. integer() | list(integer())
  • Παραμετροποιημένοι τύποι:

    • π.χ. list(integer()) - μια λίστα από ακέραιους
    • π.χ. %{age: integer()} - map με ακέραια τιμή στο κλειδί :age
  • Απομακρυσμένοι τύποι (ορίζονται σε κάποιο module), για παράδειγμα:

  • Κυριολεκτικές τιμές, για παράδειγμα:

    • %{} - ένας κενός map
    • [] - μια κενή λίστα (αλλά το [any()] είναι μια μη κενή λίστα)
    • π.χ. :ok - ένα κυριολεκτικό άτομο
  • Ενσωματωμένοι εξειδικευμένοι τύποι, για παράδειγμα:

    • char() - ένας ακέραιος από το εύρος 0..0x10FFFF
    • charlist() - μια λίστα από χαρακτήρες
    • keyword() - μια λίστα από πλειάδες δύο στοιχείων, όπου το πρώτο στοιχείο είναι ένα άτομο
  • Προσαρμοσμένοι τύποι

Ένας πλήρης κατάλογος όλων των τύπων βρίσκεται στην ενότητα "Typespecs" της επίσημης τεκμηρίωσης.

Ονομασία ορισμάτων

Τα ορίσματα στην προδιαγραφή τύπων μπορούν επίσης να έχουν ονόματα, κάτι που είναι χρήσιμο για να ξεχωρίζεις πολλά ορίσματα του ίδιου τύπου.

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

Προσαρμοσμένοι τύποι

Οι προσαρμοσμένοι τύποι μπορούν να οριστούν χρησιμοποιώντας ένα από τα τρία χαρακτηριστικά module:

  • @type - ορίζει έναν δημόσιο τύπο
  • @typep - ορίζει έναν ιδιωτικό τύπο
  • @opaque - ορίζει έναν δημόσιο τύπο του οποίου η δομή είναι ιδιωτική
@type color :: {hue :: integer, saturation :: integer, lightness :: integer}

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

String.t() έναντι binary() έναντι string()

String.t() είναι ο σωστός τύπος για συμβολοσειρές Elixir, οι οποίες είναι δυαδικά δεδομένα κωδικοποιημένα σε UTF-8. Τεχνικά, το String.t() ορίζεται ως binary(), και αυτοί οι δύο τύποι είναι ισοδύναμοι για τα εργαλεία ανάλυσης, αλλά το String.t() είναι η πιο αποκαλυπτική της πρόθεσης επιλογή για την τεκμηρίωση συναρτήσεων που χειρίζονται συμβολοσειρές Elixir.

Από την άλλη πλευρά, το string() είναι ένας διαφορετικός τύπος. Είναι μια συμβολοσειρά Erlang, γνωστή στην Elixir ως charlist. Απόφευγε τον τύπο string() στις προδιαγραφές τύπων και χρησιμοποίησε το charlist().

Dialyzer

Το Dialyzer είναι ένα εργαλείο στατικής ανάλυσης που μπορεί να εντοπίσει προβλήματα όπως σφάλματα τύπων σε κώδικα Erlang και Elixir. Ο ευκολότερος τρόπος να χρησιμοποιήσεις το Dialyzer σε ένα έργο Elixir είναι με το Dialyxir.

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

Μάθε την έννοια Typespecs