Skip to content

Commit

Permalink
Rewrite pattern matching examples
Browse files Browse the repository at this point in the history
  • Loading branch information
solar05 committed Oct 2, 2023
1 parent aa6bb34 commit d4cf490
Showing 1 changed file with 17 additions and 18 deletions.
35 changes: 17 additions & 18 deletions modules/30-flow/10-pattern-matching/description.ru.yml
Original file line number Diff line number Diff line change
Expand Up @@ -34,9 +34,9 @@ theory: |
IO.puts(age) # => 25
```
Первая строка опять выглядит как присваивание. Только значение более сложное -- кортеж из трех элементов. А вот вторая строка уже интереснее.
Первая строка опять выглядит как присваивание. Только значение более сложное -- кортеж из трех элементов. А вот вторая строка уже интереснее.
Слева от оператора `=` шаблон, который ограничивает множество значений. Этот шаблон может совпасть только с такими значениями, которые являются кортежами из трех элементов, первым элементом обязательно должен быть атом `:user`, а второй и третий элемент могут быть любыми.
Слева от оператора `=` шаблон, который ограничивает множество значений. Этот шаблон может совпасть только с такими значениями, которые являются кортежами из трех элементов, первым элементом обязательно должен быть атом `:user`, а второй и третий элемент могут быть любыми.
Справа от оператора `=` находится значение, которое мы сравниваем с шаблоном. В данном случае значение извлекается из переменной `user`, но оно может быть и результатом вызова функции или литералом.
Expand Down Expand Up @@ -69,7 +69,7 @@ theory: |
Обратите внимания на символ подчеркивания. Он совпадает с любым значением, и применяется, когда это значение не нужно, мы не хотим сохранять его в переменную.
Если переменная встречается два раза, то значения в этих местах должны быть одинаковыми:
Если переменная встречается два раза, то значения в этих местах должны быть одинаковыми:
```elixir
{a, a, 42} = {10, 10, 42} # match
Expand All @@ -78,7 +78,7 @@ theory: |
```
Но это не касается символа подчеркивания:
```elixir
{_, _, 42} = {10, 10, 42} # match
{_, _, 42} = {20, 20, 42} # match
Expand All @@ -90,7 +90,7 @@ theory: |
```elixir
[pattern] = [value]
```
Шаблон может включать:
- литералы
- переменные
Expand All @@ -107,30 +107,29 @@ theory: |
- конструкция case
- клозы функций (clause)
- обработка исключений (rescue, catch)
- чтение сообщений из mailbox процесса (receive)
- чтение сообщений из mailbox процесса (receive)
Конструкции case и function clause рассмотрим в следующей теме. Обработка исключений и чтение сообщений будут позже в курсе.
instructions: |
Реализовать функцию `get_age(user)`, которая принимает объект `user`, представленный в виде кортежа `{:user, name, age}`, и возвращает возраст (age).
Реализуйте функцию `get_age(user)`, которая принимает объект `user`, представленный в виде кортежа `{:user, name, age}`, и возвращает возраст (age).
Реализовать функцию `get_names(users)`, которая принимает список из трёх объектов `user`, представленных такими же кортежами, и возвращает список из трёх имен.
Реализуйте функцию `get_names(users)`, которая принимает список из трёх объектов `user`, представленных такими же кортежами, и возвращает список из трёх имен.
```elixir
defmodule Solution do
bob = {:user, "Bob", 42}
helen = {:user, "Helen", 20}
kate = {:user, "Kate", 22}
def get_age(user) do
# TODO реализация
end
Solution.get_age(bob) # => 42
Solution.get_age(helen) # => 20
Solution.get_age(kate) # => 22
def get_names(users) do
# TODO реализация
end
end
Solution.get_names([bob, helen, kate])
# => ["Bob", "Helen", "Kate"]
```
tips:
- |
[Про pattern matching](https://ru.wikipedia.org/wiki/%D0%A1%D0%BE%D0%BF%D0%BE%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81_%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D1%86%D0%BE%D0%BC)

0 comments on commit d4cf490

Please sign in to comment.