/
description.ru.yml
72 lines (55 loc) · 2.87 KB
/
description.ru.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
---
name: Обработка ошибок с помощью кортежей
theory: |
Как было описано в прошлом упражнении, в Elixir не используют исключения напрямую для обработки ошибок и управлением работы программы. Вместо этого из функций возвращают кортежи, если операция была успешна, то `{:ok, result}`, где `result` - результат выполнения функции. В случае ошибки возвращается кортеж вида `{:error, reason}` - где `reason` причина ошибки, может быть любого формата. Рассмотрим примеры:
```elixir
File.copy("/not_existing_dir", "/existing_dir")
# => {:error, :enoent}
File.copy("/some_dir", "/existing_dir")
# => {:ok, 210}
```
Важно отметить, что для булевых функций, лучше возвращать не кортеж, а `true` или `false`.
При таком подходе к обработке ошибок, органично использовать паттерн-матчинг:
```elixir
defmodule Example do
@magic_number 10
def multiply_by_two(number) when is_integer(number) do
{:ok, number * 2}
end
def multiply_by_two(number) do
{:error, :not_number}
end
def magic(number) do
case multiply_by_two(number) do
{:ok, result} -> {:ok, result + @magic_number}
{:error, reason} -> {:error, :no_magic_here}
end
end
end
Example.multiply_by_two(2)
# => {:ok, 4}
Example.multiply_by_two("string")
# => {:error, :not_number}
Example.magic(2)
# => {:ok, 4}
Example.magic("string")
# => {:error, :no_magic_here}
```
Для простых функций не обязательно возвращать кортеж `{:ok, result}`, достаточно вернуть только `result`. Однако если функция в разных условиях возвращает разный результат, например, словарь с разным набором ключей, тогда лучше использовать кортежи и точнее паттерн-матчить их.
instructions: |
Реализуйте функцию `compare`, которая сравнивает два переданных *числа*:
```elixir
Solution.compare(2, 3)
# => {:ok, :less}
Solution.compare(3, 3)
# => {:ok, :equal}
Solution.compare(4, 3)
# => {:ok, :greater}
Solution.compare("", 3)
# => {:error, :not_number}
Solution.compare(2, [])
# => {:error, :not_number}
```
tips:
- |
[Пример модуля с описанным подходом к обработке ошибок](https://hexdocs.pm/elixir/File.html)