天天看点

elixir 入门笔记安装基本数据类型基本运算符模式匹配控制语句键值列表-图-字典模块和函数定义枚举类型和流进程模块属性结构体协议异常处理列表速构sigils(魔法印)

如果没有 erlang 环境,上面的命令会自定安装 erlang 的环境。

/ 总是返回浮点数,如果需要整数运算,使用 div 和 rem 函数

原子是一种常量,变量名就是它的值。有2种写法:

:原子名

:"原子名"

列表中可以包含任意数据类型

列表可以通过 ++/– 来拼接

可以通过 hd/1 tl/1 函数来获取头部和头部以外的部分

对一个空列表执行 hd/1 和 tl/1 会报错

列表是以链表形式在内存存储的,元组是在内存中连续存储的。

列表前置拼接操作很快,后置拼接操作慢

后置拼接时修改了原列表的最后一个元素,所以会重建整个列表

函数的返回值一般用元组来保存

双引号包裹的是字符串: 字符串中存储的是 byte

单引号包裹的是字符列表: 字符列表中存储的是每个字符的 codepoint

算术运算 + - * / div/2 rem/2

列表拼接 ++ –

字符串拼接 <>

布尔运算符

or and not 这3个运算符只接受布尔值作为第一个参数

|| && ! 这3个运算符可以接受非布尔值作为第一个参数

比较运算符

<code>= !</code> <code>=</code> !== &lt;= &gt;= &lt; &gt;

<code>= !</code> 和 <code>=</code> !== 相比,后者的检查更加严格

不同数据类型之间也可以比较大小

不同数据类型之间的默认的顺序如下:

elixir 中 = 是模式匹配运算符

可以给list 的 head 和 tail 赋值

case的条件中可以加入判断的表达式,比如下面的 (when x &gt; 0)

只会执行第一个匹配上的分支

unless 和 if 相反,条件为false时才执行

do 语句快有2种写法:

键值列表还有另一种定义方式:(注意 a: 和 1 之间必须有个空格)

键值列表2个特点:

有序

key 可以重复,重复时,优先取排在前面的key

图的2个特点:

图中的key是无序的

图的key可以是任意类型

图匹配时,只要 = 右边包含左边的值就能匹配上

修改图中的值可以用以下的方式:

以上的 键值列表 和 图 都是 字典 ,它们都实现了 Dict 接口。

此模块现在已经 deprecated

枚举类型提供了大量函数来对列表进行操作

枚举操作都是积极的,比如如下的操作:

以上每步的操作(Enum.map, Enum.filter)都会产生一个新的列表,这就是 积极 的意思。

和上面的枚举类型对应,流的处理是 懒惰 的,比如:

表面上看,和枚举类型的处理一样,而实际上,流先创建了一系列的计算操作。然后仅当我们把它传递给Enum模块,它才会被调用。

elixir中进程都是轻量级的,所以使用时不用太在意进程的数目。

派生的进程执行完自动结束自己

发送和接收消息

下面示例中是给自己发送了一条消息,可以通过 flush/1 函数刷新消息,刷新一次之后就

也可以通过 receive/1 函数来接收

receive/1 函数收不到消息会阻塞,可以给它设置一个超时时间

进程间的连接

进程B连接进程A之后,进程A出现异常,进程B就能捕获,这样进程B就能处理进程A的异常

进程连接的方式很简单,就是 spawn_link/1 函数

进程中保存状态的方法:

elixir中模块的属性主要有3个作用:

作为一个模块的注释,通常附加上用户或虚拟机用到的信息

作为常量

在编译时作为一个临时的模块存储

注释时,一些常用的模块属性如下:

名称

含义

@moduledoc

为当前模块提供文档

@doc

为该属性后面的函数或宏提供文档

@behaviour

(注意这个单词是英式拼法)用来注明一个OTP或用户自定义行为

@before\_compile

提供一个每当模块被编译之前执行的钩子。这使得我们可以在模块被编译之前往里面注入函数。

作为常量:

测试方法:

模块中的变量只在编译时存在,所以用做临时存储,存储一些只在编译时使用的变量。

示例:

定义

使用方式

协议类似于其他语言中的接口,谁实现了协议,谁就可以使用协议,

比如下面的例子,Integer 和 User 结构体实现了协议,就可以使用协议中的方法。

使用示例:

上面的 string 类型没有实现协议,所以不能使用。

我们在实际使用中也不会对没种类型都实现协议,为了避免出现异常,可以设置协议对所有类型的默认实现

这样以后,如下使用就不会报错了

自定义异常使用 defexception/1 函数,

elixir 虽然提供了 try/catch/rescue/after 的结构,但是尽量不要使用这种结构,使用这种异常处理方式,会影响现有程序的处理流程。

elixir 的很多函数都会返回错误信号,通过信号来处理错误是推荐的方式(类似golang的错误处理),比如如下示例:

速构的意思也就是从一个列表方便的生成另一个列表。

生成器

过滤器

二进制转化为元组

into

删除空格

sigils 也就是对已有的变量或者常量做一些标记,使之变为其他的东西。

sigils 的目的就是提高 elixir 语言的扩展性。

正则表达式中的使用

表示字符串,字符以及列表的示例

~w 还可以加入其他的修饰符(比如:c, s, a 分别代表字符列表,字符串,原子)

自定义 sigils

本文转自wang_yb博客园博客,原文链接:http://www.cnblogs.com/wang_yb/p/5333019.html,如需转载请自行联系原作者