Sigils( Sigils)
在本章中,我们将探讨sigils,即语言提供的用于处理文本表示的机制。 Sigils以波浪号(〜)字符开头,后跟一个字母(标识符号),然后是分隔符; 可选地,可以在最终分隔符之后添加修饰符。
Regex
Elixir中的正则表达是符号。 我们已经在String章节中看到了它们的用法。 让我们再举一个例子来看看我们如何在Elixir中使用正则表达式。
# 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
Sigils支持8种不同的分隔符 -
~r/hello/
~r|hello|
~r"hello"
~r'hello'
~r(hello)
~r[hello]
~r{hello}
~r<hello>
支持不同分隔符背后的原因是不同的分隔符可能更适合不同的符号。 例如,对正则表达式使用括号可能是一个令人困惑的选择,因为它们可能与正则表达式中的括号混合在一起。 但是,括号可以方便其他符号,我们将在下一节中看到。
Elixir支持Perl兼容的正则表达式,也支持修饰符。 您可以here阅读有关正则表达式使用的更多信息。
字符串,字符列表和Word列表
除了正则表达式,Elixir还有3个内置的印记。 让我们来看看这些印记。
Strings
~s sigil用于生成字符串,如双引号。 例如,当一个字符串包含双引号和单引号时,~s sigil很有用 -
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 sigil用于生成字符列表 -
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 sigil用于生成单词列表(单词只是常规字符串)。 在w w sigil中,单词由空格分隔。
new_word_list = ~w(foo bar bat)
IO.puts(new_word_list)
运行上述程序时,会产生以下结果 -
foobarbat
~w sigil还接受c, s和修饰符(分别用于char列表,字符串和原子),它们指定结果列表元素的数据类型 -
new_atom_list = ~w(foo bar bat)a
IO.puts(new_atom_list)
运行上述程序时,会产生以下结果 -
[:foo, :bar, :bat]
Sigils中的插值和逃逸
除了小写符号之外,Elixir还支持大写符号来处理转义字符和插值。 虽然~s和~S都将返回字符串,但前者允许转义码和插值,而后者则不允许。 让我们考虑一个例子来理解这一点 -
~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}"
自定义印记
我们可以轻松创建自己的自定义标记。 在这个例子中,我们将创建一个sigil来将字符串转换为大写。
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表示我们希望使用u作为波浪号后面的字符。 函数定义必须带两个参数,一个输入和一个列表。