- Elixir 教程
- Elixir - 首页
- Elixir - 概述
- Elixir - 环境
- Elixir - 基本语法
- Elixir - 数据类型
- Elixir - 变量
- Elixir - 运算符
- Elixir - 模式匹配
- Elixir - 决策
- Elixir - 字符串
- Elixir - 字符列表
- Elixir - 列表和元组
- Elixir - 关键字列表
- Elixir - 映射
- Elixir - 模块
- Elixir - 别名
- Elixir - 函数
- Elixir - 递归
- Elixir - 循环
- Elixir - 可枚举
- Elixir - 流
- Elixir - 结构体
- Elixir - 协议
- Elixir - 文件 I/O
- Elixir - 进程
- Elixir - 符号
- Elixir - 推导式
- Elixir - 类型规范
- Elixir - 行为
- Elixir - 错误处理
- Elixir - 宏
- Elixir - 库
- Elixir 有用资源
- Elixir - 快速指南
- Elixir - 有用资源
- Elixir - 讨论
Elixir - 符号
在本章中,我们将探索符号,即语言提供用于处理文本表示的机制。符号以波浪号 (~) 字符开头,后跟一个字母(标识符号),然后是一个分隔符;可以选择在最终分隔符之后添加修饰符。
正则表达式
Elixir 中的正则表达式是符号。我们在字符串章节中已经看到过它们的用法。让我们再举一个例子,看看如何在 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
符号支持 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 都会返回字符串,但前者允许转义代码和插值,而后者则不允许。让我们考虑一个例子来理解这一点:
~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 作为波浪号后面的字符。函数定义必须接受两个参数,一个输入和一个列表。