Краткая шпаргалка по наиболее распространенному синтаксису эликсира.

Это краткое руководство, использующее принцип Парето (правило 80/20) к наиболее распространенному синтаксису эликсира, с которым вы можете столкнуться. Если вам нужен ускоренный курс или быстрое освежение общих концепций Elixir, эта статья для вас.

Эликсир

Эликсир - это динамический функциональный язык для создания масштабируемых и поддерживаемых приложений.

Elixir использует виртуальную машину Erlang, известную своей работой с распределенными и отказоустойчивыми системами с малой задержкой. Elixir успешно используется в веб-разработке, встроенном ПО, приеме данных и обработке мультимедиа во многих отраслях.

- https://elixir-lang.org/

Начало работы с Эликсиром

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

Вы можете запустить elixir с помощью Repl (онлайн-редактора кода), запустив файлы .ex на вашем компьютере или в среде Interactive Elixir (iex).

Использование Repl

Если вы хотите быстро приступить к работе с Elixir, вы можете использовать веб-сайт для запуска кода Elixir в веб-редакторе кода.

  • Откройте Elixir Repl.
  • Убедитесь, что он работает, набрав в редакторе следующее и нажав «Выполнить».
IO.puts “Hello World”

Должно получиться так:

Запуск Эликсира на вашем компьютере

Вы также можете установить Elixir на свой компьютер, а затем напрямую запускать файлы эликсира (.ex).

  • Установите Эликсир, если у вас его еще нет
  • Создайте новый файл с именем test.ex
  • Запишите в файл следующее:
IO.puts “Hello World”
  • В вашем терминале. В папке с вашим файлом запустите
elixir test.ex

Возможно, вы используете другой редактор, но он должен выглядеть примерно так:

Использование среды Interactive Elixir (iex).

Вы можете открыть среду Interactive Elixir, чтобы поэкспериментировать с кодом Elixir. У вас уже должен быть Установленный Эликсир на вашем компьютере.

На Mac и Linux запустите:

# On Mac and Linux run:
iex
# On Windows run:
iex.bat

Типы данных

В Elixir часто встречаются следующие типы данных:

Переменные

Переменные позволяют хранить данные, на которые будет ссылаться ваше приложение. В Elixir вы можете определить переменную как таковую:

my_integer = 4
my_float = 4.0
my_string = "Hello"

Переменные в Эликсире используют snake_case. Переменная может хранить данные любого типа; это не ограничивается приведенными выше примерами.

Комментарии

Комментарии в эликсире используют #. Для Elixir нет многострочного комментария.

# comments can be on their own line
5 + 5 # or after your code on the same line.
# but not before, because everything after the # is a comment 5 + 5

Нить

Строки в elixir - это серии символов Unicode, заключенные в двойные кавычки «».

Запись двойных кавычек внутри строки

внутри строки можно заключить двойные кавычки, используя обратную косую черту \

"a string with \"double quotes\""

Объединение строк (добавление строк)

"Brooklin" <> " " <> "Myers" # "Brooklin Myers"

Строчная интерполяция

Код на Эликсире может выполняться внутри строки с помощью # {}.

name = "Brooklin"
"Hi #{name}" # Hi Brooklin
"What is 5 + 4? #{5 + 4}." # What is 5 + 4? 9.

Строковый модуль

Вы можете получить доступ к функциям, связанным со строками, с помощью встроенного модуля String.

Целые числа и числа с плавающей запятой

Эликсир предоставляет множество механизмов для работы с целыми числами и числами с плавающей запятой.

Арифметические операторы

Арифметические операторы позволяют управлять числами.

# plus (+)
5 + 5 # 10
# minus (-)
5 - 5 # 0
# multiply (*)
5 * 5 # 25
# divide (/)
5 / 5 # 1

Целочисленные функции

В Elixir есть функции rem и div для работы с целочисленным делением и остатком.

rem(5, 4) # 1
rem(10, 6) # 4
div(3, 2) # 1 (normally 1.5 with divide /)
div(1, 2) # 0 (normally 0.5 with divide /)
div(8, 3) # 2 (normally 2.6666 with divide /)

Булевы

Логические значения - это истинные / ложные значения.

и, или, не

Используется только для сравнения логических значений:

true and true # true
true and false # false
true or false # true
false or false # false
false or not false # true
true and not true # false

Операторы сравнения

Операторы сравнения используются для сравнения значений. Они обычно используются для сравнения целых чисел и чисел с плавающей запятой, но также могут использоваться для сравнения других типов данных в целях сортировки.

точно равно ===

5 === 5   # true
5 === 5.0 # false
4 === 5   # false
4 === "4" # false

равно ==

5 == 5   # true
5 == 5.0 # true
4 == "4" # false, equals still checks type unlike some languages.

не совсем равно! ==

5 !== 5   # false
5 !== 5.0 # true
4 !== 5   # true

не равно! =

5 != 5   # false
5 != 5.0 # false
5 != 4   # true

лучше чем >

4 > 5 # false
5 > 5 # false
6 > 5 # true

меньше, чем <

4 < 5 # true
5 < 5 # false
6 < 5 # false

больше или равно (›=)

4 >= 5 # false
5 >= 5 # true
6 >= 5 # true

меньше или равно ≤

4 <= 5 # true
5 <= 5 # true
6 <= 5 # false

Сравнение значений: или (||), и (&&), а не (!)

Вы можете использовать это для сравнения любых типов данных. Все, кроме false и nil, будет считаться истиной. Это означает, что даже 0 будет считаться истинным. Важно помнить, что возвращаемое значение не является логическим. Возвращаемое значение является фактическим оцененным значением.

1 && 1           # 1
1 && false       # false
1 || false       # 1
nil || false     # false
false || !nil    # true
1 && "hey"       # "hey"
"hey" && 1       # 1
"hey" || "hello" # "hey"

Атом

Атомы - это константы, значением которых является их собственное имя. Они часто используются для представления различных значений, важных для вашего приложения. Они часто используются для обработки состояния операции, например: ok и: error.

:ok

true, false и nil - это все атомы, которым Elixir позволяет пропустить начальное двоеточие (:).

:true === true   # true
:false === false # true
:nil === nil     # true

Список

Списки в Elixir реализованы в виде связанных списков. Связанные списки содержат ноль, один или несколько элементов в выбранном порядке.

Списки сложения и вычитания с ++ и -

Модуль списка

Вы можете получить доступ к функциям, связанным со списком, с помощью встроенного модуля Список.

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

Кортеж

Используйте кортежи, если хотите хранить фиксированное количество элементов. Не используйте кортежи, когда вы хотите перебирать элементы, поскольку он не поддерживает операции Enum.

Обычно кортежи используются для хранения известных значений в ожидаемом порядке. Например, у вас может быть кортеж для пользователя с {имя, возраст, город}

{"Brooklin", 23, "Montreal"}

Модуль Tuple

Вы можете получить доступ к функциям, связанным с кортежами, с помощью встроенного модуля Кортеж.

карта

Карты - это структура данных типа "ключ-значение" в Elixir. Ключи на карте должны быть уникальными, в отличие от списков ключей и значений.

Точечная запись

Вы можете получить доступ к значениям карты, используя точечную нотацию.

my_map = %{"key" => "value"}
my_map.key # value

Точечная запись может вызывать ошибки non_existing_key

map.non_existing_key ** (KeyError) key :non_existing_key not found in: %{"key" => "value"}

Модуль карты

Вы можете получить доступ к функциям, связанным с картой, с помощью встроенного модуля Карта.

Например, вы можете избежать ошибки non_existing_key выше, используя Map.get:

Синтаксис обновления карты

Вы можете использовать специальный синтаксис для обновления ключей карты. Вы можете обновлять только существующие ключи.

Модуль Enum

При переборе данных, обычно списка, вы можете использовать Enum module, предоставляемый Elixir. списки, диапазоны и карты работают с модулем Enum.

Условные утверждения

Условные операторы используются для логики ветвления в вашем приложении.

если еще

если / иначе

Тернарный

Ternary - удобное сокращение для операторов if / else.

кейс

case принимает значение и выполняет другой путь в операторе case в зависимости от значения. Может быть полезно связать регистр с операторами переключения регистра, найденными на других языках.

Переменные в заявлении case

Вы можете использовать переменные для представления значений в аргументе case. См. N в этом примере:

конд

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

Модули и функции

Модули позволяют организовать поведение вашей программы. Например, у вас может быть модуль Greeting с функцией say_hello для возврата «Hello».

Как создать модуль и функцию

Вы заметите, что модули - это CapitalCase, а функции - snake_case.

Вызов функции

Greeting.say_hello() # Hello

Вызов функции из того же модуля

Вам не нужно ссылаться на модуль при вызове функции из того же модуля. Итак, Greeting.say_hello становится say_hello.

Функции с разными параметрами

Одна действительно интересная особенность Elixir - рассматривать две функции с одинаковым именем, но разными параметрами, как две разные функции. Например, функция Greeting.say_hello может называться say_hello / 0. 0, потому что не принимал никаких параметров.

Функция, возвращающая логическое значение, должна заканчиваться вопросительным знаком (?)

Аргументы по умолчанию

Эликсир поддерживает аргументы по умолчанию, используя \\

Кронштейны не обязательны

Используйте скобки, если считаете, что это добавляет ясности коду, или нет!

Обработка функций с использованием контекста, когда

Вы можете использовать синтаксис when, чтобы сказать, что должно произойти при определенных условиях.

Порядок ваших функций имеет значение, поскольку первая истинная функция всегда запускается первой. Вот пример использования с неправильным порядком функций.

Повторное использование модулей

Elixir предоставляет директивы для повторного использования модулей в вашем проекте.

Важно отметить, что Elixir - это компилируемый язык. Обычно он составляется с помощью инструмента под названием mix. Поэтому в отличие от таких языков, как Javascript или Ruby, вы не импортируете один файл в другой. Вместо этого модули компилируются вместе, и к ним можно получить доступ из любых файлов .ex в проекте.

Псевдоним

alias позволяет вам импортировать модуль в другой модуль и обращаться к нему под другим именем. Обычно это используется для более удобного доступа к вложенным модулям.

Импортировать

import используется для удобного доступа к функциям из других модулей.

Например, вот как можно получить доступ к функции put / 1 из модуля ввода-вывода.

использовать

Использование позволяет вам внедрять функциональность из одного модуля в другой.

Первоначально вы будете чаще всего использовать… использовать… 😅 с модулями сторонних производителей. Например, чтобы писать тесты с фреймворком ExUnit, вы будете использовать модуль ExUnit.Case.

использование - довольно сложная тема, и ее достаточно, если вы понимаете ее на поверхностном уровне на раннем этапе. Для дальнейшего чтения см. Учебник по использованию elixirschool или Прочтите документацию.

Трубка

Elixir позволяет передавать возвращаемое значение функции в другую, используя синтаксис конвейерной передачи (| ›)

Соответствие шаблону

В Elixir символ = называется оператором сопоставления. Это полезно для присвоения простых значений или для деструктуризации более сложных типов данных.

{name, age, city} = {"Brooklin", 23, "Montreal"} # using a tuple
[a, b, c] = [1, 2, 3] # using a list
[head | tail] = [1, 2, 3] # you saw this before with lists

MatchError

Если ваша деструктуризация не соответствует значению в правой части, вы получите MatchError

{a, b, c} = {:hello, "world"}
** (MatchError) no match of right hand side value: {:hello, "world"}

Вывод

Надеюсь, эта статья поможет вам быстро познакомиться с некоторыми из наиболее важных частей Elixir.

Я многое упустил, чтобы статья была лаконичной. Чтобы узнать больше, Документация по Эликсиру - отличное место для начала.

Прокомментируйте, если вы заметили какие-либо неточности или если вы думаете, что есть другой синтаксис Elixir, который я должен был покрыть. Вы поможете мне и всем остальным, читая это! Если вам понравилась эта статья, пожалуйста, хлопайте в ладоши или подписывайтесь на меня, чтобы увидеть больше образовательных статей по программированию.