В этой главе мы собираемся изучить сигилы, механизмы, предоставляемые языком для работы с текстовыми представлениями. Символы начинаются с символа тильды (~), за которым следует буква (обозначающая символ), а затем разделитель; по желанию, модификаторы могут быть добавлены после окончательного разделителя.
Regex
Регулярные выражения в эликсире — это сигилы. Мы видели их использование в главе String. Давайте снова возьмем пример, чтобы увидеть, как мы можем использовать регулярные выражения в эликсире.
# A regular expression that matches strings which contain "foo" or # "bar": regex = ~r/foo|bar/ IO.puts("foo" =~ regex) IO.puts("baz" =~ regex)
Когда вышеуказанная программа запущена, она дает следующий результат —
true false
Сигилы поддерживают 8 различных разделителей —
~r/hello/ ~r|hello| ~r"hello" ~r'hello' ~r(hello) ~r[hello] ~r{hello} ~r<hello>
Причина поддержки разных разделителей состоит в том, что разные разделители могут быть более подходящими для разных символов. Например, использование скобок для регулярных выражений может быть запутанным выбором, поскольку они могут смешиваться с круглыми скобками внутри регулярного выражения. Тем не менее, скобки могут быть полезны для других символов, как мы увидим в следующем разделе.
Elixir поддерживает Perl-совместимые регулярные выражения, а также поддерживает модификаторы. Вы можете прочитать больше об использовании регулярных выражений здесь .
Строки, списки символов и списки слов
Помимо регулярных выражений, в Elixir есть еще 3 встроенных сигилы. Давайте посмотрим на сигилы.
Струны
Символ s используется для генерации строк, как двойные кавычки. Символ ~ s полезен, например, когда строка содержит как двойные, так и одинарные кавычки —
new_string = ~s(this is a string with "double" quotes, not 'single' ones) IO.puts(new_string)
Этот символ генерирует строки. Когда вышеуказанная программа запущена, она дает следующий результат —
"this is a string with \"double\" quotes, not 'single' ones"
Списки символов
Символ ~ c используется для создания списков символов —
new_char_list = ~c(this is a char list containing 'single quotes') IO.puts(new_char_list)
Когда вышеуказанная программа запущена, она дает следующий результат —
this is a char list containing 'single quotes'
Списки слов
Символ ~ w используется для генерации списков слов (слова являются обычными строками). В символе ~ w слова разделяются пробелами.
new_word_list = ~w(foo bar bat) IO.puts(new_word_list)
Когда вышеуказанная программа запущена, она дает следующий результат —
foobarbat
Символ ~ w также принимает модификаторы c, s и a (для списков символов, строк и атомов соответственно), которые указывают тип данных элементов результирующего списка —
new_atom_list = ~w(foo bar bat)a IO.puts(new_atom_list)
Когда вышеуказанная программа запущена, она дает следующий результат —
[:foo, :bar, :bat]
Интерполяция и побег в сигилах
Помимо строчных символов, Elixir поддерживает прописные символы для работы с экранирующими символами и интерполяцией. Хотя и ~ s, и ~ S будут возвращать строки, первый допускает escape-коды и интерполяцию, а второй — нет. Давайте рассмотрим пример, чтобы понять это —
~s(String with escape codes \x26 #{"inter" <> "polation"}) # "String with escape codes & interpolation" ~S(String without escape codes \x26 without #{interpolation}) # "String without escape codes \\x26 without \#{interpolation}"
Пользовательские сигилы
Мы можем легко создавать свои собственные сигилы. В этом примере мы создадим сигил для преобразования строки в верхний регистр.
defmodule CustomSigil do def sigil_u(string, []), do: String.upcase(string) end import CustomSigil IO.puts(~u/tutorials point/)
Когда мы запускаем приведенный выше код, он дает следующий результат —
TUTORIALS POINT
Сначала мы определяем модуль с именем CustomSigil, и внутри этого модуля мы создали функцию с именем sigil_u. Поскольку в существующем пространстве сигилов нет существующего символа, мы будем его использовать. _U указывает, что мы хотим использовать вас как символ после тильды. Определение функции должно принимать два аргумента, входные данные и список.