Учебники

Эликсир — Сигилс

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

Regex

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

Live Demo

# 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 используется для создания списков символов —

Live Demo

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 слова разделяются пробелами.

Live Demo

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 указывает, что мы хотим использовать вас как символ после тильды. Определение функции должно принимать два аргумента, входные данные и список.