--- language: elixir contributors: - ["Joao Marques", "http://github.com/mrshankly"] - ["Dzianis Dashkevich", "https://github.com/dskecse"] - ["Ryan Plant", "https://github.com/ryanplant-au"] translator: - ["Ev Bogdanov", "https://github.com/evbogdanov"] filename: learnelixir-ru.ex lang: ru-ru --- Elixir — современный функциональный язык программирования, который работает на виртуальной машине Erlang. Elixir полностью совместим с Erlang, но обладает дружелюбным синтаксисом и предлагает больше возможностей. ```elixir # Однострочные комментарии начинаются с символа решётки. # Для многострочных комментариев отдельного синтаксиса нет, # поэтому просто используйте несколько однострочных комментариев. # Запустить интерактивную Elixir-консоль (аналог `irb` в Ruby) можно # при помощи команды `iex`. # Чтобы скомпилировать модуль, воспользуйтесь командой `elixirc`. # Обе команды будут работать из терминала, если вы правильно установили Elixir. ## --------------------------- ## -- Базовые типы ## --------------------------- # Числа 3 # целое число 0x1F # целое число 3.0 # число с плавающей запятой # Атомы, которые являются нечисловыми константами. Они начинаются с символа `:`. :hello # атом # Кортежи, которые хранятся в памяти последовательно. {1,2,3} # кортеж # Получить доступ к элементу кортежа мы можем с помощью функции `elem`: elem({1, 2, 3}, 0) #=> 1 # Списки, которые реализованы как связные списки. [1,2,3] # список # У каждого непустого списка есть голова (первый элемент списка) # и хвост (все остальные элементы списка): [head | tail] = [1,2,3] head #=> 1 tail #=> [2,3] # В Elixir, как и в Erlang, знак `=` служит для сопоставления с образцом, # а не для операции присваивания. # # Это означает, что выражение слева от знака `=` (образец) сопоставляется с # выражением справа. # # Сопоставление с образцом позволило нам получить голову и хвост списка # в примере выше. # Если выражения слева и справа от знака `=` не удаётся сопоставить, будет # брошена ошибка. Например, если кортежи разных размеров. {a, b, c} = {1, 2} #=> ** (MatchError) # Бинарные данные <<1,2,3>> # Вы столкнётесь с двумя видами строк: "hello" # Elixir-строка (заключена в двойные кавычки) 'hello' # Erlang-строка (заключена в одинарные кавычки) # Все строки представлены в кодировке UTF-8: "привет" #=> "привет" # Многострочный текст """ Я текст на несколько строк. """ #=> "Я текст на несколько\nстрок.\n" # Чем Elixir-строки отличаются от Erlang-строк? Elixir-строки являются бинарными # данными. <> #=> "abc" # Erlang-строка — это на самом деле список. [?a, ?b, ?c] #=> 'abc' # Оператор `?` возвращает целое число, соответствующее данному символу. ?a #=> 97 # Для объединения бинарных данных (и Elixir-строк) используйте `<>` <<1,2,3>> <> <<4,5>> #=> <<1,2,3,4,5>> "hello " <> "world" #=> "hello world" # Для объединения списков (и Erlang-строк) используйте `++` [1,2,3] ++ [4,5] #=> [1,2,3,4,5] 'hello ' ++ 'world' #=> 'hello world' # Диапазоны записываются как `начало..конец` (оба включительно) 1..10 #=> 1..10 # Сопоставление с образцом применимо и для диапазонов: lower..upper = 1..10 [lower, upper] #=> [1, 10] # Карты (известны вам по другим языкам как ассоциативные массивы, словари, хэши) genders = %{"david" => "male", "gillian" => "female"} genders["david"] #=> "male" # Для карт, где ключами выступают атомы, доступен специальный синтаксис genders = %{david: "male", gillian: "female"} genders.gillian #=> "female" ```