Do you want to pick up from where you left of?
Take me there

Строковые метки

Создание и использование строковых меток.

Обзор строковых меток

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

Список доступных строковых меток:

Список доступных разделителей:

Список символов

Строковые метки ~c и ~C создают списки символов. Например:

iex> ~c/2 + 7 = #{2 + 7}/
'2 + 7 = 9'

iex> ~C/2 + 7 = #{2 + 7}/
'2 + 7 = \#{2 + 7}'

Видно, что строчная ~c интерполирует вычисление, а прописная ~C — нет. Далее мы увидим, что во всех встроенных строковых метках встречается такое разделение на строчные и прописные.

Регулярные выражения

Строковые метки ~r и ~R используются для представления регулярных выражений. Мы можем создавать их для использования на лету, либо для применения функций Regex. Например:

iex> re = ~r/elixir/
~r/elixir/

iex> "Elixir" =~ re
false

iex> "elixir" =~ re
true

Как мы видим, в первом тесте на равенство слово Elixir не соответствует регулярному выражению. Дело в том, что оно начинается с заглавной буквы. Elixir поддерживает регулярные выражения PCRE (Perl Compatible Regular Expressions), поэтому мы можем добавить i в конец нашей строковой метки, чтобы отключить регистрозависимость.

iex> re = ~r/elixir/i
~r/elixir/i

iex> "Elixir" =~ re
true

iex> "elixir" =~ re
true

Также Elixir поддерживает Regex API, основанный на библиотеке регулярных выражений из Erlang. Попробуем воспользоваться Regex.split/2 на строковой метке регулярного выражения:

iex> string = "100_000_000"
"100_000_000"

iex> Regex.split(~r/_/, string)
["100", "000", "000"]

Как мы видим, благодаря строковой метке ~r/_/ выражение "100_000_000" разделилось на части по символу подчёркивания. Функция Regex.split возвращает список.

Строка

Строковые метки ~s и ~S используются для создания строк. Например:

iex> ~s/the cat in the hat on the mat/
"the cat in the hat on the mat"

iex> ~S/the cat in the hat on the mat/
"the cat in the hat on the mat"

Но в чём разница? Отличие такое же, как в строковых метках списка символов, которые мы уже рассмотрели ранее — интерполяция и экранирование. Посмотрим на ещё один пример:

iex> ~s/welcome to elixir #{String.downcase "SCHOOL"}/
"welcome to elixir school"

iex> ~S/welcome to elixir #{String.downcase "SCHOOL"}/
"welcome to elixir \#{String.downcase \"SCHOOL\"}"

Список слов

Строковая метка списка слов иногда может оказаться весьма полезной. Эта возможность упростит код и сэкономит время. Возьмём простой пример:

iex> ~w/i love elixir school/
["i", "love", "elixir", "school"]

iex> ~W/i love elixir school/
["i", "love", "elixir", "school"]

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

iex> ~w/i love #{'e'}lixir school/
["i", "love", "elixir", "school"]

iex> ~W/i love #{'e'}lixir school/
["i", "love", "\#{'e'}lixir", "school"]

NaiveDateTime

NaiveDateTime используется для быстрого создания структуры, представляющей собой DateTime без часового пояса.

Как правило, стоит избегать создания NaiveDateTime напрямую. Однако это может пригодиться для сопоставления с образцом. Например:

iex> NaiveDateTime.from_iso8601("2015-01-23 23:50:07") == {:ok, ~N[2015-01-23 23:50:07]}

Создание строковых меток

Одной из целей разработки языка Elixir было создать гибкий и расширяемый язык программирования. Потому неудивительно, что мы можем создавать свои строковые метки. В этом примере мы создадим строковую метку, которая превращает все символы строки в заглавные. Так как в ядре Elixir уже есть функция (String.upcase/1), то сделаем нашу строковую метку на её основе.


iex> defmodule MySigils do
...>   def sigil_u(string, []), do: String.upcase(string)
...> end

iex> import MySigils
nil

iex> ~u/elixir school/
ELIXIR SCHOOL

Для начала объявим модуль с именем MySigils и внутри него создадим функцию sigil_u. Мы используем ~u, потому что она не занята в пространстве строковых меток. _u означает, что мы хотим использовать символ u после тильды. Функция должна принимать два аргумента: вводимое значение и список.

Caught a mistake or want to contribute to the lesson? Edit this lesson on GitHub!