Skip to content

Commit

Permalink
Add Basics lesson elixirschool#2 (Collections)
Browse files Browse the repository at this point in the history
  • Loading branch information
michalvalasek authored and DenysonSoares committed Mar 15, 2016
1 parent 45c6ee9 commit a10d929
Showing 1 changed file with 157 additions and 0 deletions.
157 changes: 157 additions & 0 deletions sk/lessons/basics/collections.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,157 @@
---
layout: page
title: Kolekcie
category: basics
order: 2
lang: sk
---


Listy, tuples, keywords, mapy, dictionaries a kombinátory.

## Obsah

- [Zoznamy](#zoznamy)
- [Spájanie zoznamov](#spjanie-zoznamov)
- [Odčítavanie zoznamov](#odtavanie-zoznamov)
- [Head / Tail](#head--tail)
- [Tuples](#tuples)
- [Keyword lists](#keyword-lists)
- [Mapy](#mapy)

## Zoznamy

Zoznamy (lists) sú jednoduché kolekcie hodnôt, ktoré môžu obsahovať viacero dátových typov. Môžu tiež obsahovať neunikátne hodnoty (t.j. prvky sa môžu opakovať):

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

V Elixire sú zoznamy implementované ako linked lists. To znamená, že prístup k prvkom zoznamu je operácia so zložitosťou `O(n)` (lineárna zložitosť). Z tohto dôvodu je zvyčajne rýchlejšie nové prvky pridávať na začiatok zoznamu, než na jeho koniec:

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


### Spájanie zoznamov

Na spájanie zoznamov (list concatenation) slúži v Elixire operátor `++`:

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

### List Subtraction

Odčítanie zoznamov sa robí operátorom `--`; odčítanie hodnoty, ktorá v pôvodnom zozname neexistuje, je v poriadku:

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

### Head / Tail

Pri práci so zoznamami je veľmi bežné pristupovanie k tzv. Head a Tail zoznamu. Head (hlava) je prvý element zoznamu, Tail (chvost) je jeho zvyšok. Elixir nám na prístup k týmto častiam poskytuje dve užitočné funkcie `hd` a `tl`:

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

Naviac, ako si ukážeme v neskorších lekciách, sa na tento účel dá krásne použiť operátor pipe (`|`):

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

## Tuples

Tuples sú podobné zoznamom, no v pamäti sú ulošené ako súvislá oblasť. Vďaka tomu je prístup k ich prvkom veľmi rýchly, rovnako ako zisťovanie ich dĺžky (size). Na duhú stranu, modifikácia tuplov je náročná a pomalá, pretože nový (zmenený) tuple musí byť v pamäti kompletne prekopírovaný. Tuples definujeme pomocou zložených zátvoriek:

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

Veľmi bežne sa tuples používajú ako návratové hodnoty z funkcií - v kapitole o pattern matchingu si ukážeme, ako veľmi užitočný mechanizmus to je:

```elixir
iex> File.read("path/to/existing/file")
{:ok, "... contents ..."}
iex> File.read("path/to/unknown/file")
{:error, :enoent}
```

## Keyword lists

Keyword lists (keywordové zoznamy) a Mapy sú asociatívnymi kolekciami Elixiru. Obe dátové štruktúry implementujú modul `Dict`. Keyword listy sú zoznamami dvojprvkových tuplov, pričom prvým prvkom v každom tuple je vždy Atom. Z hľadiska výkonu sú na tom teda rovnako, ako zoznamy (rýchle čítanie, pomalé modifikácie):

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

Pre keyword listy je charakteristické:

+ Kľúčami sú Atomy
+ Kľúče sú zoradené (ordered)
+ Kľúče nie sú unikátne

Pre tieto vlastnosti sú keyword listy najčastejšie využívané na odovzdávanie options (pomenovaných parametrov) do funkcií.

## Mapy

Na uchovávanie informácií typu kľúč-hodnota (key-value store) slúžia v Elixire Mapy. Na rozdiel od keyword listov Mapy neudržujú poradie prvkov a môžme v nich ako kľúč použiť akýkoľvek dátový typ (t.j. nielen atom). Mapu definujeme syntaxou `%{}`:

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

Od verzie 1.2 povoľuje Elixir použiť ako kľúče aj premenné:

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

Keď do mapy pridáme prvok s rovnakým kľúčom, aký už v mape máme, nový prvok prepíše pôvodný.

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

Ako je vidno v predošlom príklade, pre mapy, ktorých kľúčami sú výhradne atomy, existuje špeciálna (kratšia) syntax:

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

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

0 comments on commit a10d929

Please sign in to comment.