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 году (я только что начал), ожидайте несколько постов об эликсире в неделю по мере того, как я узнаю и открываю.
Если вы хотите стать частью этого приключения со мной, вы можете:
- Следите за новостями 🎉
- Поговори со мной в твиттере 📝
- Загляните ко мне на twitch (увидеть прототип/продукт в действии 💪)
Хорошего дня!
ТТФН