文档章节

elixir官方入门教程 印记

ljzn
 ljzn
发布于 2016/08/06 09:28
字数 1362
阅读 20
收藏 0
点赞 0
评论 0

#印记

  1. 正则表达式
  2. 字符串,字符列表和单词的印记
  3. 字符串
  4. 字符列表
  5. 单词列表
  6. 印记的插值与转义
  7. 自定义印记

我们已经知道Elixir提供了双引号包裹的字符串和单引号包裹的字符列表.然而,这只覆盖了语言中由着文本表示的结构体表面.例如,创造原子大多数是以:atom来表示.

Elixir的目标之一是扩展性:开发者应当可以将语言扩展以适应任何特定领域.计算机科学的应用是如此之广,没有任何语言能够在核心中处理许多的领域.所以,我们最好的选择是提高语言的扩展性,使得开发者,公司和社区能够将语言扩展到他们相关的领域.

本章,我们将探索印记,它是语言提供的一种用于处理文本表示的机制.印记由波浪符(~)开头,之后是定义印记的单词,然后是分隔符;修饰符可以选择性添加在最后的分隔符之后.

#正则表达式

Elixir中最常用的印记是~r,用于创造正则表达式:

# A regular expression that matches strings which contain "foo" or "bar":
iex> regex = ~r/foo|bar/
~r/foo|bar/
iex> "foo" =~ regex
true
iex> "bat" =~ regex
false

Elixir提供Perl兼容的正则表达式(regexes),由PCRE库实现.正则也支持修饰符.例如,修饰符i使得正则表达式对大小写不敏感:

iex> "HELLO" =~ ~r/hello/
false
iex> "HELLO" =~ ~r/hello/i
true

查看Regex模块以获得更多关于正则表达式的修饰符和操作的信息.

目前,所有的例子都用/来包围正则表达式.然而印记支持8种分隔符:

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

支持不同的分隔符的原因是可以更好地适应不同的印记.例如,使用括号作为分隔符可能会和正则中的括号搞混.然而,括号对于其它的印记可能很好用,比如我们将看到的.

#字符串,字符列表和单词的印记

除了正则表达式,Elixir还提供了3种印记.

##字符串

~s印记用于生成字符串,作用于双引号相同.当字符串包含双引号和单引号时,~s印记就很有用了:

iex> ~s(this is a string with "double" quotes, not 'single' ones)
"this is a string with \"double\" quotes, not 'single' ones"

##字符列表

~c印记用于生成字符列表:

iex> ~c(this is a char list containing 'single quotes')
'this is a char list containing \'single quotes\''

##单词列表

~w印记用于生成单词列表(单词 只是普通字符串).在~w印记中,单词由空格分隔.

iex> ~w(foo bar bat)
["foo", "bar", "bat"]

~w印记也支持c,sa修饰符(分别适用于字符列表,字符串和原子),能够指定最后的列表中元素的数据类型:

iex> ~w(foo bar bat)a
[:foo, :bar, :bat]

#印记的插值与逃避

除了小写印记,Elixir也支持用于处理转义字符与插值的大写印记.虽然~s~S都会返回字符串,但前者支持转义代码和插值,而后者不支持:

iex> ~s(String with escape codes \x26 #{"inter" <> "polation"})
"String with escape codes & interpolation"
iex> ~S(String without escape codes \x26 without #{interpolation})
"String without escape codes \\x26 without \#{interpolation}"

下列转义代码可以用于字符串和字符列表:

\" – 双引号
\' – 单引号
\\ – 单反斜杠
\a – 响铃/警告
\b – 推格
\d - 删除
\e - 退出
\f - 换页符
\n – 换行符
\r – 回车
\s – 空格
\t – 制表符
\v – 垂直制表符
\0 - 空字节
\xDD - 以16进制表示单字节 (例如 \x13)
\uDDDD and \u{D...} - 以16进制表示Unicode代码点 (例如 \u{1F600})

印记也支持大段注释,以三个单引号或双引号分隔:

iex> ~s"""
...> this is
...> a heredoc string
...> """

大段注释印记最常用于书写文档.例如,在文档中书写转义字符会很麻烦,因为需要对某些符号使用双重转义:

@doc """
Converts double-quotes to single-quotes.

## Examples

    iex> convert("\\\"foo\\\"")
    "'foo'"

"""
def convert(...)

使用~S,这些问题就可以避免:

@doc ~S"""
Converts double-quotes to single-quotes.

## Examples

    iex> convert("\"foo\"")
    "'foo'"

"""
def convert(...)

#自定义印记

正如本章开始时提到的,Elixir中的印记也具有扩展性.事实上,使用印记~r/foo/i相当于使用一个二进制数和一个字符列表作为参数调用sigil_r:

iex> sigil_r(<<"foo">>, 'i')
~r"foo"i

我们可以通过sigil_r获取~r印记的文档:

iex> h sigil_r
...

我们也可以简单地在sigil_{identifier}模式之后添加需要实现的函数来自定义我们的印记.例如,让我们用~i印记来返回一个整数(使用修饰符n可以将其变为负数):

iex> defmodule MySigils do
...>   def sigil_i(string, []), do: String.to_integer(string)
...>   def sigil_i(string, [?n]), do: -String.to_integer(string)
...> end
iex> import MySigils
iex> ~i(13)
13
iex> ~i(42)n
-42

印记也可以在宏的帮助下进行编译时工作.例如,在编译源代码时,Elixir中的正则表达式会被编译成一个高效的表示方法,在运行时就可以跳过此步骤.如果你对此感兴趣,我们建议你学习宏的知识,并了解印记是如何在Kernel模块中被实现的(sigil_*函数就是在那里定义的).

© 著作权归作者所有

共有 人打赏支持
ljzn
粉丝 29
博文 69
码字总数 96245
作品 0
南平
程序员
Elixir 学习资源

Elixir 官网 getting started官方入门学习资源 官方文档 hex 包管理系统 elixir sips 比较不错视频课程 Elixir China 中文论坛 官方wiki Elixir by Example Awesome Elixir Elixir Quiz 通过...

lidashuang
2017/11/29
0
0
elixir官方入门教程 介绍

介绍 安装 交互模式 运行脚本 提出疑问 欢迎! 在本教程中我们将教给你Elixir的基础,语法,如何定义模块,如何操作常用数据结构的特性等等.本章将确保Elixir安装好了,并且你能够成功运行Elixir的...

ljzn
2016/08/06
70
0
elixir官方入门教程 学习资料

下一步该去哪 构建你的第一个Elixir项目 元编程 社区与其它资源 Erlang基础 想要学习更多?继续阅读! 构建你的第一个Elixir项目 为了开始你的第一个项目,Elixir装载了一个叫做Mix的构建工具....

ljzn
2016/08/06
144
0
总有你要的编程书单(GitHub )

目录 IDE IntelliJ IDEA 简体中文专题教程 MySQL 21分钟MySQL入门教程 MySQL索引背后的数据结构及算法原理 NoSQL Disque 使用教程 Neo4j .rb 中文資源 Redis 命令参考 Redis 设计与实现 The ...

汇智网
2017/11/22
0
0
elixir官方教程Mix与OTP(一) Mix入门

Mix入门 我们的第一个项目 编辑项目 执行测试 环境 探索 在本教程中,我们将学习如何构建一个完整的Elixir应用,包括监督树,配置,测试等等. 这个应用的功能是分布式键值仓库.我们将把键值对安排...

ljzn
2016/08/07
1K
2
elixir官方入门教程 进程

进程 和 链接 任务 状态 在Elixir中,所有代码都运行在进程内。进程相互独立,并发地运行,通过传送信息来交流。进程不是Elixir中唯一的并发基础,但它意味着能够构建分布式的,可容错的程序...

ljzn
2016/08/04
34
0
elixir官方入门教程 模块

模块 编译 脚本模式 具名函数 函数捕获 默认参数 在Elixir中我们将一些函数集合到模块里。在之前的章节里我们已经使用了许多不同的模块,例如模块: 为了创造我们自己的模块,需要用到宏。我...

ljzn
2016/08/03
54
0
elixir官方入门教程 别名,要求与进口

别名,要求与进口 别名 要求 进口 使用 理解别名 模块嵌套 群体别名/进口/要求/使用 为了方便软件复用,Elixir提供了三个命令(,和)外加一个宏,简介如下: 现在我们将详细探索它们.记住前三条之所...

ljzn
2016/08/04
255
2
开源电子书

目录 语言无关类 操作系统 智能系统 分布式系统 编译原理 函数式概念 计算机图形学 WEB服务器 版本控制 编辑器 NoSQL PostgreSQL MySQL 管理和监控 项目相关 设计模式 Web 大数据 编程艺术 ...

zting科技
2017/12/11
0
0
elixir官方入门教程 Erlang库

Erlang库 二进制模块 格式化文本输出 加密模块 图片模块 Erlang长期存储 数学模块 队列模块 随机模块 压缩模块 Elixir提供了与Erlang库优秀的互用性.事实上,Elixir不鼓励简单地包装Erlang库,...

ljzn
2016/08/06
59
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

利用世界杯,读懂 Python 装饰器

Python 装饰器是在面试过程高频被问到的问题,装饰器也是一个非常好用的特性, 熟练掌握装饰器会让你的编程思路更加宽广,程序也更加 pythonic。 今天就结合最近的世界杯带大家理解下装饰器。...

p柯西
9分钟前
0
0
Xshell登录阿里云服务器ECS

Xshell登录阿里云服务器ECS 1. 参考资料: 1). 《阿里云服务器怎么用?阿里云服务器使用教程》 链接:http://www.cr173.com/html/50758_1.html 2). eagle-zhang的CSDN博客《Xshell连接不上阿...

SuShine
18分钟前
1
0
IDEA中的HTTP Client Editor测试API

在前后端分离项目,前后端通过api进行通信。如果用postman免费版进行api测试的话,由于无法保存测试脚本到文件,不方便前端查看。 你可以选择付费版。也可以利用IDEA自带的HTTP Client Edito...

hutaishi
21分钟前
0
0
解决“只能通过Chrome网上应用商店安装该程序”的方法

摘要 : 最近有些用户反映某个Chrome插件在安装的时候,提示“只能通过Chrome网上应用商店安装该程序”,为了解决这一问题,Chrome插件网带来了相关的解决方法。 某些用户在Chrome插件网下载了...

沧海一刀
22分钟前
0
0
通过UNIX域套接字传递文件描述符

  传送文件描述符是高并发网络服务编程的一种常见实现方式。Nebula 高性能通用网络框架即采用了UNIX域套接字传递文件描述符设计和实现。本文详细说明一下传送文件描述符的应用。 1. TCP服务...

Bwar
25分钟前
0
0
python操作Excle

# -*- coding: utf-8 -*-from openpyxl import load_workbook, Workbook#index:第几个sheet页,第一个sheet页的index为0def readExcle(filename,index): # 加载excle文件 wb = l......

淺陌离殇
27分钟前
0
0
Apache爆日志文件漏洞

全球使用最广泛的Web服务器Apache近日被爆出了一个安全漏洞,该漏洞可能导致攻击者控制服务器。 该漏洞包含在mod_rewrite 模块中的do_rewritelog()日志函数中。由于该函数还无法完全过滤写入...

问题终结者
今天
0
0
阿里巴巴内部开发手册

现代软件架构的复杂性需要协同开发完成,如何高效地协同呢?无规矩不成方圆,无规范难以协同,比如,制订交通法规表面上是要限制行车权,实际上是保障公众的人身安全,试想如果没有限速,没有...

zbbmaster
今天
0
0
34.任务计划cron chkconfig systemctl管理服务 unit target

10.23 linux任务计划cron 10.24 chkconfig工具 10.25 systemd管理服务 10.26 unit介绍 10.27 target介绍 10.23 linux任务计划cron: 在linux中任务计划是必不可少的,因为可能我们凌晨的时候...

王鑫linux
今天
0
0
logback.xml for spring boot

logback.xml config <?xml version="1.0" encoding="UTF-8"?><configuration> <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.Colo......

qwfys
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部