LINUX.ORG.RU

Что такое pattern matching простыми словами?

 , ,


0

1

Добрый день товарищи программисты! Объясните пожалуйста простыми словами что значит pattern matching? На днях начал штудировать Elixir. И заклинился на таком понятии как pattern matching. То есть привожу пример:

iex(1)> a = "привет"
"привет"
iex(2)> "привет" = a
"привет"

Они равны! Но почему? Почему их места поменялись и при этом равны? В питоне, на сишке, шарпе, джаве такое не прокатит. А здесь что это за волшебство такое?

Ответ на: комментарий от slaykovsky

Спасибо за ссылки. Я пытался понять то что написано на википедии, но там очень абстрактно было написано,поэтому и спросил здесь. Просто мне немного непонятно чем отличаются связывание имен в традиционных процедурных/ооп языках чем функциональной? То есть этот самый pattern matching оно что ли, отличие ооп? Или я немного не догоняю?)

dimcoin ()

Elixir это же поверх Erlang'овской VM сделанный язык, да? Если так, то = это не присваивание.

В первом случае это декларация, что атом (вроде так это в эрланге называли) a это строка «привет». Во втором - это просто проверка того, что выражение логически корректно с учетом конкретных значений входящих в него атомов.

Менять значение атома повторно нельзя, его можно лишь задекларировать выражением единожды (в рамках области видимости, если память не изменяет).

Это иммутабельность называется.

Идеологически, должно быть возможность написать что-то типа такого:

> [a, b, 10500] = [10, -233, 10500]

> (a, -233) = (10, b)

и выполниться без ошибок (код не проверял :D ).

Norgat ★★★★★ ()
Ответ на: комментарий от dimcoin

Представь, что это как декларация константы и switch (абстрактно).

Связывание — это именование значений в ограниченном контексте.

Присваивание — это хранение значений в некой ячейке памяти. Повторное присваивание может изменить старое значение на новое в пределах типа, например.

Связывание имен осмысляет значения в рамках какого-то контекста. Когда ты объявляешь переменную bla как, например, double, значение, которое прицеплено к bla это значение типа double в ограниченном контексте. bla можно представить как контейнер, который хранит в себе значение double, которое может быть изменено. Можешь представить это как адрес в памяти, где значение может храниться, а может и не может.

А если ты объявляешь bla как double со значением 3.14 то внутри контекста любое использование bla эквивалентно использованию 3.14. Если объявляешь bla как константу, то ее изменить нельзя и поэтому значение должно быть указано сразу.

Связывание — это именование значения, которое нельзя изменить внутри определенного контекста.

slaykovsky ★★ ()
Последнее исправление: slaykovsky (всего исправлений: 1)