С переменными:
iex(2)> x = %{a: 1, b: 2}
%{a: 1, b: 2}
iex(3)> %{a: 1, b: 2} = y
** (CompileError) iex:3: undefined function y/0
С переменными параметров функции:
defmodule A do
def go1(z = %{a: a}) do
IO.inspect z
IO.puts a
end
def go2(%{a: a} = z) do
IO.inspect z
IO.puts a
end
end
В iex:
iex(4)> c "a.ex"
warning: redefining module A (current version defined in memory)
a.ex:1
[A]
iex(5)> map = %{a: 1, b: 2}
%{a: 1, b: 2}
iex(6)> A.go1(map)
%{a: 1, b: 2}
1
:ok
iex(7)> A.go2(map)
%{a: 1, b: 2}
1
:ok
Аргументы функции соответствуют шаблону переменным параметров функции. И в функции эликсира параметры могут быть постоянными, например, 1 или атом, карты, кортежи и т. Д., А не просто переменная, такая как x, y или z. Вот как работает go1()
:
A.go1(%{a: 1 b: 2})
|-----+----|
|
| %{a: a} = %{a: 1 b: 2}
V
def go1(z = %{a: a}) do
«Переменная параметра» равна %{a: a}
, и она сопоставляется с аргументом функции %{a: 1 b: 2}
, который связывает a
с 1
. Затем вы можете подумать, что вы получите совпадение с шаблоном: z = %{a: 1}
, однако совпадение с шаблоном %{a: a} = %{a: 1 b: 2}
фактически возвращает правую часть:
iex(10)> %{a: a} = %{a: 1, b: 2}
%{a: 1, b: 2}
Таким образом, вы получите соответствие шаблону: z = %{a: 1, b: 2}
. Вот еще одна демонстрация этого:
iex(13)> z = %{a: a} = %{a: 1, b: 2}
%{a: 1, b: 2}
iex(14)> a
1
iex(15)> z
%{a: 1, b: 2}
Вот как go2()
работает:
A.go1(%{a: 1 b: 2})
|-----+----|
|
| z = %{a: 1, b: 2}
V
def go2(%{a: a} = z)
z
- переменная параметра, и она сопоставляется с аргументом функции %{a: 1 b: 2}
. Матч z = %{a: 1 b: 2}
возвращает правую часть:
iex(10)> z = %{a: 1, b: 2}
%{a: 1, b: 2}
Итак, затем вы получите соответствие шаблону: %{a: a} = %{a: 1, b: 2}
, который связывает a
с 1
.
Следовательно, все соответствует: при каждом сопоставлении с шаблоном шаблон, содержащий переменные, находится слева от =
, а значения - с правой стороны. Если вы ищете правило, это: в списке параметров для определения функции, справа от знака =
находится «переменная параметра». Слева - шаблон, который будет сопоставлен после сопоставления «переменной параметра» с аргументом функции (или, как вы сказали бы в других языках: «после назначения аргумента функции переменной параметра»).