Может ли кто-нибудь объяснить мне, что такое сопоставление с образцом, используя простое объяснение. Объяснение, понятное любому.
Сопоставление с образцом - это то, как инициируется присваивание в erlang. В других языках знак =
является оператором присваивания, например x = 10
. Однако в erlang знак =
- это оператор сопоставления с шаблоном. Когда erlang видит знак =
, он смотрит на член справа от знака =
, затем пытается присвоить значения переменным слева от знака равенства, так что обе стороны знака =
идентичны. , т.е. они совпадают.
В простом случае, например, X = 1
, похоже, знак =
выполняет присваивание в erlang. Фактически, X
будет иметь значение 1
после оценки этого оператора. Однако на других языках нельзя написать следующее:
{Y, 10} = {20, 10}
В других языках у вас не может быть констант в левой части оператора присваивания. Однако в erlang указание констант слева от оператора сопоставления с шаблоном совершенно нормально. После оценки этого оператора Y будет иметь значение 20
, потому что для того, чтобы обе стороны знака =
были идентичными, erlang должен присвоить Y значение 20
.
Как Erlang выполняет это задание? На самом деле это не имеет значения, но вы можете думать об операторе присваивания в erlang как о трех символах !*!
. Когда erlang видит оператор сопоставления с образцом в приведенном выше примере, чтобы добиться совпадения, erlang использует оператор присваивания !*!
для присвоения значения 20
Y
, то есть Y !*! 20
.
Когда вы пишете =
на эрланге, вы спрашиваете: «Пожалуйста, постарайтесь, чтобы эти вещи совпадали!». Эффект заключается в том, что erlang выполнит некоторые присваивания (!*!
), чтобы обе стороны совпадали. Вы не можете выполнять присваивание напрямую самостоятельно, все, что вы можете сделать, это попросить erlang привести все в соответствие. Если это слишком сбивает с толку, просто подумайте об операторе сопоставления с образцом как о трюковом операторе присваивания, который более мощный, чем оператор присваивания в других языках. Неважно, как вы называете =
вход в erlang, вам просто нужно знать, как это работает.
В erlang сопоставление с образцом можно использовать по-разному:
1) Чтобы извлечь позиционные значения из структуры данных:
15> [X, {Y, _}] = [10, {1, hello}].
[10,{1,hello}]
16> X.
10
17> Y.
1
2) Чтобы определить, какое предложение функции выполняется в определении функции:
my.erl:
go(X, hello) ->
io:format("Do stuff: ~w~n", [X*2]);
go(X, goodbye) ->
io:format("Do other stuff: ~w~n", [X-2]);
go(_, _) ->
io:format("Okay.~n").
В оболочке:
7> c(my).
my.erl:2: Warning: export_all flag enabled - all functions will be exported
{ok,my}
8> my:go(3, 4).
Okay
ok
9> my:go(2, goodbye).
Do other stuff: 0
ok
10> my:go(10, hello).
Do stuff: 20
ok
При первом вызове функции erlang выполняет следующее сопоставление с образцом:
{X, hello} = {3, 4}
... что не удается, потому что никакое значение, которое erlang может присвоить (!*!
) X
, не приведет к совпадению обеих сторон. Итак, erlang переходит к следующему предложению функции и выполняет сопоставление:
{X, goodbye} = {3, 4}
что тоже терпит неудачу; наконец, третье предложение функции совпадает, поэтому операторы в теле этого предложения функции выполняются.
3) Регистр, составление списков и т. д.
person
7stud
schedule
27.04.2019