Может кто-нибудь объяснить мне, что такое Pattern Matching, используя
простое объяснение. Объяснение, в котором любой мог понять.
Сопоставление с образцом - это то, как присваивается в эрланге. На других языках знак =
является оператором присваивания, например, x = 10
. Однако в эрланге знак =
является оператором сопоставления с шаблоном . Когда Эрланг видит знак =
, он смотрит на член справа от знака =
, а затем пытается присвоить значения переменным в левой части знака равенства, чтобы обе стороны =
знак идентичен, т.е. совпадает.
В простом случае, например, X = 1
, похоже, знак =
выполняет присваивание в erlang. И действительно, X
будет иметь значение 1
после того, как этот оператор будет оценен. Тем не менее, вы не можете написать следующее на других языках:
{Y, 10} = {20, 10}
На других языках у вас не может быть констант в левой части оператора присваивания. Однако в erlang указание констант слева от оператора сопоставления с шаблоном совершенно нормально. После оценки этого оператора Y будет иметь значение 20
, поскольку для того, чтобы обе стороны знака =
были идентичными, erlang должен присвоить Y * значение 20
.
Как Эрланг выполняет это задание? Это не имеет большого значения, но вы можете думать об операторе присваивания в эрланге как о трех символах !*!
. Когда erlang видит оператор сопоставления с образцом в приведенном выше примере, для того, чтобы привести в соответствие вещи, erlang использует оператор присваивания !*!
, чтобы присвоить значение 20
Y
, т.е. Y !*! 20
.
Когда вы пишете =
на эрланге, вы спрашиваете: «Пожалуйста, постарайтесь, чтобы эти вещи соответствовали!». Эффект стука заключается в том, что Эрланг выполнит несколько заданий (!*!
), чтобы обе стороны совпадали. Вы не можете выполнять задания самостоятельно, все, что вы можете сделать, это попросить Эрланга привести все в соответствие. Если это слишком запутанно, просто представьте себе оператор сопоставления с шаблоном как оператор специализированного назначения , который является более мощным, чем оператор присваивания в других языках. Неважно, что вы называете знаком =
на эрланге, вам просто нужно знать, как это работает.
В эрланге сопоставление с образцом можно использовать по-разному:
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) Ситуации, списки и т. Д.