forked from elixirschool/elixirschool
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add Basics lesson elixirschool#6 (Pipe operator).
- Loading branch information
1 parent
54b223e
commit 05cb7f2
Showing
1 changed file
with
71 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,71 @@ | ||
--- | ||
layout: page | ||
title: Operátor pipe | ||
category: basics | ||
order: 6 | ||
lang: sk | ||
--- | ||
|
||
Operátor `|>` posiela výstup výrazu ako prvý parameter do iného výrazu. | ||
|
||
## Obsah | ||
|
||
- [Úvod](#vod) | ||
- [Príklady](#prklady) | ||
- [Best Practices](#best-practices) | ||
|
||
## Úvod | ||
|
||
Vo funkcionálnom programovaní sa v praxi môžeme rýchlo zamotať do vnorených volaní funkcií. Pozrime sa na nasledujúci príklad: | ||
|
||
```elixir | ||
foo(bar(baz(new_function(other_function())))) | ||
``` | ||
|
||
Návratovú hodnotu z `other_function` posielame do `new_function`, jej návratovú hodnotu zasa do `baz`, z nej do `bar` a nakoniec návratovú hodnotu z `bar` posielame do `foo`. Elixir má na tento chaos pragmatické riešenie v podobe operátora *pipe* - `|>`. Tento zoberie návratovú hodnotu z výrazu na svojej ľavej strane a pošle ju ako prvý argument do výrazu na pravej strane. Pozrime sa na rovnaký príklad prepísaný pomocou operátora pipe: | ||
|
||
```elixir | ||
other_function() |> new_function() |> baz() |> bar() |> foo() | ||
``` | ||
|
||
## Príklady | ||
|
||
V nasledujúcich príkladoch budeme používať modul String v interaktívnom príkazovom riadku `iex`: | ||
|
||
- Rozdelenie reťazca na slová | ||
|
||
```shell | ||
iex> "Elixir rocks" |> String.split | ||
["Elixir", "rocks"] | ||
``` | ||
|
||
- Prevedenie slov na veľké písmená | ||
|
||
```shell | ||
iex> "Elixir rocks" |> String.split |> Enum.map( &String.upcase/1 ) | ||
["ELIXIR", "ROCKS"] | ||
``` | ||
|
||
- Overovanie, či reťazec končí nejakým iným reťazcom | ||
|
||
```shell | ||
iex> "elixir" |> String.ends_with?("ixir") | ||
true | ||
``` | ||
|
||
## Best Practices | ||
|
||
Ak je arita (počet argumentov) funkcie väčšia, než 1, použite vo volaní funkcie zátvorky. Ide hlavne o čitateľnosť pre ostatných programátorov, ktorým by chýbajúce zátvorky mohli spôsobiť zmätok pri čítaní nášho kódu. Ak si zoberieme druhý príklad a odstránime zátvorky z volania `Enum.map`, dostaneme nasledujúce varovanie o nejednoznačnosti volania: | ||
|
||
```shell | ||
iex> "Elixir rocks" |> String.split |> Enum.map &String.upcase/1 | ||
iex: warning: you are piping into a function call without parentheses, which may be ambiguous. Please wrap the function you are piping into in parenthesis. For example: | ||
|
||
foo 1 |> bar 2 |> baz 3 | ||
|
||
Should be written as: | ||
|
||
foo(1) |> bar(2) |> baz(3) | ||
|
||
["ELIXIR", "ROCKS"] | ||
``` |