Elixir - Sigils

Neste capítulo, vamos explorar sigilos, os mecanismos fornecidos pela linguagem para trabalhar com representações textuais. Os sigilos começam com o caractere til (~) que é seguido por uma letra (que identifica o sigilo) e então um delimitador; opcionalmente, modificadores podem ser adicionados após o delimitador final.

Regex

Regexes no Elixir são sigilos. Vimos seu uso no capítulo String. Vamos novamente dar um exemplo para ver como podemos usar regex no Elixir.

# A regular expression that matches strings which contain "foo" or
# "bar":
regex = ~r/foo|bar/
IO.puts("foo" =~ regex)
IO.puts("baz" =~ regex)

Quando o programa acima é executado, ele produz o seguinte resultado -

true
false

Sigilos suportam 8 delimitadores diferentes -

~r/hello/
~r|hello|
~r"hello"
~r'hello'
~r(hello)
~r[hello]
~r{hello}
~r<hello>

A razão por trás do suporte a delimitadores diferentes é que delimitadores diferentes podem ser mais adequados para sigilos diferentes. Por exemplo, usar parênteses para expressões regulares pode ser uma escolha confusa, pois eles podem se misturar com os parênteses dentro da regex. No entanto, parênteses podem ser úteis para outros sigilos, como veremos na próxima seção.

Elixir suporta regexes compatíveis com Perl e também suporta modificadores. Você pode ler mais sobre o uso de regexes aqui .

Strings, listas de caracteres e listas de palavras

Além de regexes, Elixir tem mais 3 sigilos embutidos. Vamos dar uma olhada nos sigilos.

Cordas

O sigilo do ~ s é usado para gerar strings, como as aspas duplas. O sigilo do ~ s é útil, por exemplo, quando uma string contém aspas duplas e simples -

new_string = ~s(this is a string with "double" quotes, not 'single' ones)
IO.puts(new_string)

Este sigilo gera cordas. Quando o programa acima é executado, ele produz o seguinte resultado -

"this is a string with \"double\" quotes, not 'single' ones"

Listas de caracteres

O sigilo ~ c é usado para gerar listas de caracteres -

new_char_list = ~c(this is a char list containing 'single quotes')
IO.puts(new_char_list)

Quando o programa acima é executado, ele produz o seguinte resultado -

this is a char list containing 'single quotes'

Listas de Palavras

O sigilo ~ w é usado para gerar listas de palavras (palavras são apenas strings regulares). Dentro do sigilo ~ w, as palavras são separadas por espaços em branco.

new_word_list = ~w(foo bar bat)
IO.puts(new_word_list)

Quando o programa acima é executado, ele produz o seguinte resultado -

foobarbat

O sigilo ~ w também aceita o c, s e a modificadores (para listas de caracteres, strings e átomos, respectivamente), que especificam o tipo de dados dos elementos da lista resultante -

new_atom_list = ~w(foo bar bat)a
IO.puts(new_atom_list)

Quando o programa acima é executado, ele produz o seguinte resultado -

[:foo, :bar, :bat]

Interpolação e fuga em sigilos

Além de sigilos em minúsculas, Elixir suporta sigilos em maiúsculas para lidar com caracteres de escape e interpolação. Enquanto ~ se ~ S retornarão strings, o primeiro permite códigos de escape e interpolação, enquanto o último não. Vamos considerar um exemplo para entender isso -

~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}"

Sigilos Personalizados

Podemos criar facilmente nossos próprios sigilos personalizados. Neste exemplo, criaremos um sigilo para converter uma string em maiúsculas.

defmodule CustomSigil do
   def sigil_u(string, []), do: String.upcase(string)
end

import CustomSigil

IO.puts(~u/tutorials point/)

Quando executamos o código acima, ele produz o seguinte resultado -

TUTORIALS POINT

Primeiro definimos um módulo chamado CustomSigil e dentro desse módulo, criamos uma função chamada sigil_u. Como não há sigilo ~ u existente no espaço de sigilos existente, nós o usaremos. O _u indica que desejamos usar u como o caractere após o til. A definição da função deve levar dois argumentos, uma entrada e uma lista.