Elixir - listy i krotki
Listy (połączone)
Lista połączona to niejednorodna lista elementów, które są przechowywane w różnych lokalizacjach w pamięci i są śledzone za pomocą odniesień. Listy połączone to struktury danych używane szczególnie w programowaniu funkcjonalnym.
Elixir używa nawiasów kwadratowych do określenia listy wartości. Wartości mogą być dowolnego typu -
[1, 2, true, 3]
Kiedy Elixir widzi listę drukowalnych numerów ASCII, Elixir wydrukuje ją jako listę znaków (dosłownie listę znaków). Ilekroć widzisz wartość w IEx i nie jesteś pewien, co to jest, możesz użyć rozszerzeniai funkcję pobierania informacji na jej temat.
IO.puts([104, 101, 108, 108, 111])
Wszystkie powyższe znaki na liście można wydrukować. Uruchomienie powyższego programu daje następujący wynik -
hello
Możesz także definiować listy w drugą stronę, używając pojedynczych cudzysłowów -
IO.puts(is_list('Hello'))
Uruchomienie powyższego programu daje następujący wynik -
true
Pamiętaj, że reprezentacje w apostrofach i podwójnych cudzysłowach nie są równoważne w Elixirze, ponieważ są reprezentowane przez różne typy.
Długość listy
Aby znaleźć długość listy, używamy funkcji length, jak w następującym programie -
IO.puts(length([1, 2, :true, "str"]))
Powyższy program generuje następujący wynik -
4
Łączenie i odejmowanie
Dwie listy można łączyć i odejmować przy użyciu rozszerzenia ++ i --operatorzy. Rozważ poniższy przykład, aby zrozumieć funkcje.
IO.puts([1, 2, 3] ++ [4, 5, 6])
IO.puts([1, true, 2, false, 3, true] -- [true, false])
W pierwszym przypadku otrzymamy konkatenowany ciąg, aw drugim odejmowany. Powyższy program generuje następujący wynik -
[1, 2, 3, 4, 5, 6]
[1, 2, 3, true]
Głowa i ogon listy
Głowa jest pierwszym elementem listy, a ogon jest pozostałą częścią listy. Można je pobrać za pomocą funkcjihd i tl. Przypiszmy listę do zmiennej i pobierzmy jej początek i koniec.
list = [1, 2, 3]
IO.puts(hd(list))
IO.puts(tl(list))
To da nam początek i koniec listy jako wyjście. Powyższy program generuje następujący wynik -
1
[2, 3]
Note - Uzyskanie początku lub końca pustej listy jest błędem.
Inne funkcje listy
Biblioteka standardowa Elixir zapewnia całą masę funkcji do obsługi list. Przyjrzymy się niektórym z nich tutaj. Resztę możesz sprawdzić tutaj Lista .
S.no. | Nazwa i opis funkcji |
---|---|
1 | delete(list, item) Usuwa daną pozycję z listy. Zwraca listę bez elementu. Jeśli element występuje na liście więcej niż raz, usuwane jest tylko pierwsze wystąpienie. |
2 | delete_at(list, index) Tworzy nową listę, usuwając wartość o określonym indeksie. Indeksy ujemne wskazują przesunięcie od końca listy. Jeśli indeks jest poza zakresem, zwracana jest oryginalna lista. |
3 | first(list) Zwraca pierwszy element z listy lub nil, jeśli lista jest pusta. |
4 | flatten(list) Spłaszcza podaną listę zagnieżdżonych list. |
5 | insert_at(list, index, value) Zwraca listę z wartością wstawioną w określonym indeksie. Zwróć uwagę, że indeks jest ograniczony do długości listy. Indeksy ujemne wskazują przesunięcie od końca listy. |
6 | last(list) Zwraca ostatni element na liście lub zero, jeśli lista jest pusta. |
Krotki
Krotki to także struktury danych, które przechowują w sobie szereg innych struktur. W przeciwieństwie do list przechowują elementy w ciągłym bloku pamięci. Oznacza to, że dostęp do elementu krotki na indeks lub uzyskanie rozmiaru krotki jest szybką operacją. Indeksy zaczynają się od zera.
Elixir używa nawiasów klamrowych do definiowania krotek. Podobnie jak listy, krotki mogą mieć dowolną wartość -
{:ok, "hello"}
Długość krotki
Aby uzyskać długość krotki, użyj rozszerzenia tuple_size funkcjonować jak w poniższym programie -
IO.puts(tuple_size({:ok, "hello"}))
Powyższy program generuje następujący wynik -
2
Dołączanie wartości
Aby dołączyć wartość do krotki, użyj funkcji Tuple.append -
tuple = {:ok, "Hello"}
Tuple.append(tuple, :world)
Spowoduje to utworzenie i zwrócenie nowej krotki: {: ok, "Hello",: world}
Wstawianie wartości
Aby wstawić wartość na danej pozycji, możemy użyć Tuple.insert_at funkcja lub put_elemfunkcjonować. Rozważ następujący przykład, aby zrozumieć to samo -
tuple = {:bar, :baz}
new_tuple_1 = Tuple.insert_at(tuple, 0, :foo)
new_tuple_2 = put_elem(tuple, 1, :foobar)
Zauważ, że put_elem i insert_atzwrócił nowe krotki. Oryginalna krotka przechowywana w zmiennej krotki nie została zmodyfikowana, ponieważ typy danych Elixir są niezmienne. Będąc niezmiennym, kod Elixir jest łatwiejszy do rozważenia, ponieważ nigdy nie musisz się martwić, jeśli określony kod powoduje mutację struktury danych.
Krotki a listy
Jaka jest różnica między listami a krotkami?
Listy są przechowywane w pamięci jako listy połączone, co oznacza, że każdy element listy przechowuje swoją wartość i wskazuje na następny element, aż do osiągnięcia końca listy. Nazywamy każdą parę wartości i wskaźnika komórką wad. Oznacza to, że dostęp do długości listy jest operacją liniową: musimy przejść przez całą listę, aby określić jej rozmiar. Aktualizacja listy jest szybka, o ile przygotowujemy elementy.
Z drugiej strony krotki są przechowywane w pamięci ciągłej. Oznacza to, że uzyskanie rozmiaru krotki lub dostęp do elementu za pomocą indeksu jest szybki. Jednak aktualizowanie lub dodawanie elementów do krotek jest kosztowne, ponieważ wymaga skopiowania całej krotki w pamięci.