美文网首页
Elixir-魔符

Elixir-魔符

作者: 你期待的花开 | 来源:发表于2018-11-14 17:36 被阅读19次

Elixir 提供了一种叫做 魔符的语法糖来标识和处理字面量。一个魔符已~开头然后接上一个字符。Elixir 已经提供了一些内置的魔符。当然,如果你需要的话,也可以自己创造魔符。

下面是一些可以直接使用的魔符(对着下面的例子看更好):

  • ~C 创建一个不处理插值和转义字符的字符列表
  • ~c 创建一个处理插值和转义字符的字符列表
  • ~R 创建一个不处理插值和转义字符的正则表达式
  • ~r 创建一个处理插值和转义字符的正则表达式
  • ~S 创建一个不处理插值和转义字符的字符列表
  • ~s 创建一个处理插值和转义字符的字符列表
  • ~W 创建一个不处理插值和转义字符的单词列表
  • ~w 创建一个处理插值和转义字符的单词列表
  • ~N 创建一个 NaiveDateTime 格式的数据结构

可用的分隔符如下:

  • <...> 尖括号
  • {...} 大括号
  • [...] 中括号
  • (...) 小括号
  • |...| 两条直线(反斜杠上面那个)
  • /.../ 斜杠
  • "..." 双引号
  • '...' 单引号

字符列表

~c~C会分别创建不同的字符列表. 比如:

iex> ~c/2 + 7 = #{2 + 7}/
'2 + 7 = 9'

iex> ~C/2 + 7 = #{2 + 7}/
'2 + 7 = \#{2 + 7}'

可以看到,~c小写c对应的魔符处理了字符列表中的插入值,然而~C大写C对应的魔符没有处理。在内置的魔符中,这种大小写代表相反的场景的例子很常见。

正则表达式

~r~R这两个魔符用来表示正则表达式。可以用这两个魔符来声明一个正则表达式或者通过Regex函数来使用它们。举个例子:

iex> re = ~r/elixir/
~r/elixir/

iex> "Elixir" =~ re
false

iex> "elixir" =~ re
true

在这个例子中,”Elixir”并不与re的值相等。 这是因为正则表达式是大小写敏感的。由于Elixir支持 Perl Compatible Regular Expressions (PCRE), 因此可以在魔符的末尾加i来关闭大小写敏感。

iex> re = ~r/elixir/i
~r/elixir/i

iex> "Elixir" =~ re
true

iex> "elixir" =~ re
true

除此之外, Elixir还提供基于Erlang正则表达式库的 Regex API。 让我们用正则表达式的魔符来实现Regex.split/2 :

iex> string = "100_000_000"
"100_000_000"

iex> Regex.split(~r/_/, string)
["100", "000", "000"]

如上所示, 字符串 "100_000_000" 根据正则表达式~r/_/ (代表匹配下划线)被切分了。函数 Regex.split返回一个列表。

字符串

~s~S 这两个魔符用来创建字符串。举个例子:

iex> ~s/welcome to elixir #{String.downcase "SCHOOL"}/
"welcome to elixir school"

iex> ~S/welcome to elixir #{String.downcase "SCHOOL"}/
"welcome to elixir \#{String.downcase \"SCHOOL\"}"

单词列表

这个魔符可以在处理表示句子的字符串的时候省下很多精力。 它可以降低代码复杂度、节省时间、按键次数。因为它能够将一个字符串自动分割并返回一个列表。举个简单的例子 :

iex> ~w/i love #{'e'}lixir school/
["i", "love", "elixir", "school"]

iex> ~W/i love #{'e'}lixir school/
["i", "love", "\#{'e'}lixir", "school"]
真·时间日期

当需要创建不带时区的时间格式的数据结构时,魔符真·时间日期将很有用。

在大部分情况下,应该避免直接使用这个魔符创建时间格式的数据。但是,这个魔符在模式匹配的时候很有用。 举个例子:

iex> NaiveDateTime.from_iso8601("2015-01-23 23:50:07") == {:ok, ~N[2015-01-23 23:50:07]}

定义自己的魔符

Elixir这门语言有一个目的就是让Elixir成为一门可扩展的语言。因此你能够定义或者是创建自己的魔符并不是什么奇怪的事情。 在下面这个例子中,我们将定义一个魔符,它能够将小写字符串转化为大写字符串。尽管已经有一个函数 String.upcase/1实现了这个功能,我们仍将对那个函数进行包装,让它变成一个语法糖。

iex> defmodule MySigils do
...>   def sigil_u(string, []), do: String.upcase(string)
...> end

iex> import MySigils
nil

iex> ~u/elixir school/
ELIXIR SCHOOL

首先我们创建了一个模块 MySigils ,然后定义了一个函数sigil_u。因为没有一个已经存在的魔符是~u这个格式的,所以这个魔符的形式就是它。函数名后面的_u表示我们想要用u作为这个魔符的标识。这个函数接受两个参数,一个输出和一个列表。

相关文章

  • Elixir-魔符

    Elixir 提供了一种叫做 魔符的语法糖来标识和处理字面量。一个魔符已~开头然后接上一个字符。Elixir 已经...

  • Elixir-管道操作符

    管道操作符|>把前面表达式的结果传递给后面的表达式作为第一个参数。 编程可以变得很混乱,比如函数调用有多层嵌套以至...

  • 爱情魔符

    今天早上起来就发现我昨天的作业有人给我评论了。打开一看,评论的内容是,不管他猴年马月了,珍惜当下吧。还让我加油呢。...

  • Elixir-组合

    模块 模块是把函数组织到不同命名空间的最好的办法,除了能为函数分组,他还允许我们定义命名函数和私有函数。 Elix...

  • Elixir-函数

    目录 匿名函数& 操作符 模式匹配 命名函数函数名字和元数私有函数卫兵参数默认值 匿名函数 匿名函数就是没有名字,...

  • Elixir-推导

    在 Elixir 中,列表推导是循环遍历枚举值的语法糖。 基础 推导经常用来根据 Enum 和 Stream生...

  • Elixir-并发

    Elixir 的一大卖点就是对并发的支持,得益于 Erlang VM (BEAM) ,Elixir 的并发要比预期...

  • Elixir-基础

    安装 在https://elixir-lang.org 上可以找到安装说明。 使用 elixir -v 查看 el...

  • Elixir-集合

    列表、元组、关键字列表(keywords)、图(maps)、字典和函数组合子(combinators) 目录 列表...

  • Galdrastafir:冰岛魔符

    Galdrastafir是一种冰岛魔符,大约出现在1400-1800年之间(中世纪晚期到现代早期),大多数来自十七...

网友评论

      本文标题:Elixir-魔符

      本文链接:https://www.haomeiwen.com/subject/cauqmftx.html