a.k.a Как сломать себе мозг, когда приходишь с другого языка

Продолжая приключения изучения эликсира во 2-й половине 2021 года, сегодня мы углубляемся в оператор = и делаем несколько безумных уроков!

При прочих равных условиях

Подожди подожди подожди. Символ = – это "оператор сопоставления"!!!!!!!

Я знал, что Эликсир заставит мой мозг болеть…

Первоначально я думал, что это связано с тем, что функциональное программирование не может производить мутации, но позже я пришел к выводу, что это сопоставление и связывание (где это возможно), поэтому в моих глазах это похоже на ограниченное присваивание: присваивать только в том случае, если у нас есть совпадение. Если Эликсир не может подобрать совпадение, он выдает MatchError.

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

> a = 1
1
> 1 = a
1

В Ruby вы получите синтаксическую ошибку, пытаясь присвоить 1 чему-то другому 🚨.

Мне нужно было просто проверить, есть ли еще оператор ==, вот как я потрясен 🤣 (есть, если вы так же волновались).

Интересно, что у вас должно быть что-то, что уже существует в правой части, это не волей-неволей ничего никуда не помещается:

>  1 = a
** (CompileError) iex:1: undefined function a/0
> 1 = "hippo"
** (MatchError) no match of right hand side value: "hippo"

Давайте возьмем этого оператора матча в детский сад и поиграем в грязную игру!

> a = b = c = 3 # same as a=(b=(c=3))
3
> a
3
> b
3
> c
3

Я не знаю, зачем вам это, но вы можете связать их :)

Переменный развод

Я не ожидал, что смогу «переназначить» переменную:

> a = 1
1
> a = 100
100

Так что переменные (если они вообще так называются 🤪) не со своими значениями на всю жизнь!

Исследуя, что происходит под капотом, механизм сопоставления пытается повторно связать a, если это возможно, чтобы сделать совпадение, однако, если вы хотите убедиться, что a не будет повторно связан во время совпадения, вы можете использовать 'оператор булавки' ​​^ вот так

> a = 1
1
> ^a = 2
* (MatchError) no match of right hand side value: 2

Затем мы получаем уже знакомое нам MatchError , разве не приятно :)

Структурированные отношения

Оператор сопоставления также работает с массивами (и, я думаю, с другими структурами данных), но вы должны убедиться, что обе стороны имеют одинаковые э-э…. структура:

> [a] = [[1,2,3]]
[[1,2,3]]
> a
[1,2,3]
> [1, a] = [1, 2, 3]
** (MatchError) no match of right hand side value: [1, 2, 3]
> [1, a, b] = [1, 2, 3]
[1, 2, 3]
> b
3

Это кажется очень близким к деструктуризации в Ruby/JS, за исключением того, что опять же это неправильный способ думать об этом, потому что это все о присваиваниях, это делает сопоставление с образцом!

Этот волшебный термин, который я с нетерпением жду, когда узнаю его в самой простой форме — чистая красота!

Матч, заключенный на небесах

Вау, это было весело! Эликсир снова потряс мой мир!

Вчера это была документация, а сегодня это самые основные операторы программирования — тебе-не-должно-остаться-со-мной-навсегда-но-я-думаю-мы-а-а- match =sign, довольно броско!

Это часть моей серии статей об Эликсире, где я изучаю Эликсир в 2021 году (я только что начал), ожидайте несколько постов об эликсире в неделю по мере того, как я узнаю и открываю.

Если вы хотите стать частью этого приключения со мной, вы можете:

Хорошего дня!

ТТФН