Elixir - 符号

在本章中,我们将探讨符号,即语言提供的用于处理文本表示的机制。 符号以波形符 (~) 字符开头,后跟一个字母(标识符号),然后是分隔符; (可选)可以在最终分隔符之后添加修饰符。

正则表达式

Elixir 中的正则表达式是符号。 我们已经在字符串章节中看到了它们的使用。 让我们再次举个例子来看看如何在 Elixir 中使用正则表达式。

# 匹配包含"foo"或"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 兼容的正则表达式,还支持修饰符。 您可以在此处阅读有关正则表达式使用的更多信息。

字符串、字符列表和单词列表

除了正则表达式之外,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、sa 修饰符(分别用于字符列表、字符串和原子),它们指定元素的数据类型 结果列表中的 −

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

当上面的程序运行时,会产生以下结果 −

[:foo, :bar, :bat]

符号中的插值和转义

除了小写字符外,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}"

自定义符号

我们可以轻松创建自己的自定义符号。 在此示例中,我们将创建一个符号以将字符串转换为大写。

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 表示我们希望使用 u 作为波浪号后面的字符。 函数定义必须采用两个参数:一个输入和一个列表。