Fork me on GitHub

Συλλογές

Λίστες, tuples, λέξεις κλειδί, χάρτες και συναρτησιακοί συνδυαστές.

Πίνακας περιεχομένων

Λίστες

Οι λίστες είναι απλές συλλογές τιμών, μπορεί να περιλαμβάνουν πολλαπλούς τύπους. Οι λίστες μπορεί να περιλαμβάνουν μη μοναδικές τιμές:

iex> [3.41, :pie, "Apple"]
[3.41, :pie, "Apple"]

Η Elixir υλοποιεί μια λίστα σαν συνδεδεμένη λίστα. Αυτό σημαίνει ότι η πρόσβαση στο σύνολο της λίστας είναι μια O(n) λειτουργία. Για αυτό το λόγο, είναι συνήθως πιο γρήγορο να προσθέτετε δεδομένα στην αρχή, παρά στο τέλος:

iex> list = [3.41, :pie, "Apple"]
[3.41, :pie, "Apple"]
iex> ["π"] ++ list
["π", 3.41, :pie, "Apple"]
iex> list ++ ["Cherry"]
[3.41, :pie, "Apple", "Cherry"]

Ένωση Λιστών

Η ένωση λιστών χρησιμοποιεί τον τελεστή ++/2:

iex> [1, 2] ++ [3, 4, 1]
[1, 2, 3, 4, 1]

Αφαίρεση Λιστών

Παρέχεται υποστήριξη για αφαίρεση μέσω του τελεστή --/2. Είναι ασφαλές να αφαιρέσετε μια τιμή που δεν υπάρχει:

iex> ["foo", :bar, 42] -- [42, "bar"]
["foo", :bar]

Σημείωση: Χρησιμοποιεί αυστηρή σύγκριση για να αντιπαραβάλει τις τιμές.

Κεφαλή / Ουρά

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

iex> hd [3.41, :pie, "Apple"]
3.41
iex> tl [3.41, :pie, "Apple"]
[:pie, "Apple"]

Επιπρόσθετα στις προαναφερθείσες συναρτήσεις, μπορείτε να χρησιμοποιήσετε αντιπαραβολές προτύπων και τον τελεστή σωλήνα | για να χωρίσετε μια λίστα στην κεφαλή και την ουρά. Θα μάθουμε περισσότερα για αυτό το πρότυπο σε μεταγενέστερα μαθήματα:

iex> [h|t] = [3.41, :pie, "Apple"]
[3.41, :pie, "Apple"]
iex> h
3.41
iex> t
[:pie, "Apple"]

Τούπλες

Οι τούπλες είναι όμοιες με τις λίστες αλλά αποθηκεύονται συνεχόμενα στη μνήμη. Αυτό κάνει την πρόσβαση στο σύνολό τους γρήγορη αλλά ακριβή την μετατροπή. Η νέα τούπλα θα πρέπει να αντιγραφεί συνολικά εξ’ ολοκλήρου στη μνήμη. Οι τούπλες ορίζονται με άγκιστρα:

iex> {3.41, :pie, "Apple"}
{3.41, :pie, "Apple"}

Είναι σύνηθες για τις τούπλες να χρησιμοποιούνται σαν μηχανισμός επιστροφής πρόσθετων πληροφοριών από τις συναρτήσεις. Αυτή η χρησιμότητα θα είναι πιο εμφανής όταν θα ασχοληθούμε με το ταίριασμα προτύπων:

iex> File.read("διαδρομή/προς/υπάρχων/αρχείο")
{:ok, "... contents ..."}
iex> File.read("διαδρομή/προς/άγνωστο/αρχείο")
{:error, :enoent}

Λίστες Λέξεων Κλειδί

Οι λέξεις κλειδί και οι χάρτες είναι οι συσχετισμένες συλλογές στην Elixir. Στην Elixir, μια λίστα λέξεων κλειδί είναι μια ειδική λίστα από τούπλες των οποίων το πρώτο στοιχείο είναι ένα άτομο. Έχουν τις ίδιες επιδόσεις με τις λίστες:

iex> [foo: "bar", hello: "world"]
[foo: "bar", hello: "world"]
iex> [{:foo, "bar"}, {:hello, "world"}]
[foo: "bar", hello: "world"]

Τα τρία χαρακτηριστικά των λιστών λέξεων κλειδί δίνουν έμφαση στην σπουδιαότητά τους:

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

Χάρτες

Στην Elixir οι χάρτες είναι η βασικότερη επιλογή για αποθήκη κλειδιών-τιμών. Αντίθετα με τις λίστες λέξεων κλειδί, επιτρέπουν κλειδιά οποιουδήποτε τύπου και δεν είναι ταξινομημένα. Μπορείτε να ορίσετε ένα χάρτη με το συντακτικό %{}:

iex> map = %{:foo => "bar", "hello" => :world}
%{:foo => "bar", "hello" => :world}
iex> map[:foo]
"bar"
iex> map["hello"]
:world

Από την έκδοση 1.2 της Elixir και μετά, οι μεταβλητές επιτρέπονται σαν κλειδιά χαρτών:

iex> key = "hello"
"hello"
iex> %{key => "world"}
%{"hello" => "world"}

Αν προστεθεί ένα διπλότυπο σε ένα χάρτη, θα αντικαταστήσει την προγενέστερη τιμή:

iex> %{:foo => "bar", :foo => "hello world"}
%{foo: "hello world"}

Όπως μπορούμε να δούμε από την έξοδο από πάνω, υπάρχει ένα ειδικό συντακτικό για χάρτες που περιλαμβάνουν μόνο άτομα σαν κλειδιά:

iex> %{foo: "bar", hello: "world"}
%{foo: "bar", hello: "world"}

iex> %{foo: "bar", hello: "world"} == %{:foo => "bar", :hello => "world"}
true

Μια άλλη ενδιαφέρουσα ιδιότητα των χαρτών είναι ότι παρέχουν το δικό τους συντακτικό για την αλλαγή και την πρόσβαση των κλειδιών που είναι άτομα:

iex> map = %{foo: "bar", hello: "world"}
%{foo: "bar", hello: "world"}
iex> %{map | foo: "baz"}
%{foo: "baz", hello: "world"}
iex> map.hello
"world"

Share This Page