Elixir
内置类型有:
- 值类型
- 任意大小的整数
- 浮点数
- 原子
- 区间
- 正则表达式
- 系统类型
- PID和端口
- 引用
- 集合类型
- 元组
- 列表
- 散列表
- 二进制
值类型
整数
整数字面量可被写作十进制(1234),十六进制(0xcafe),八进制(0o765)和二进制(0b1010)。
数值较大的时候可以用下划线分组。
1_000_000
等同于:1000000
浮点数
浮点数使用含小数点的十进制表示,小数点前后必须有一位数字,结尾指数可选。
1.0
0.2456
0.314159el
314159.0e-5
符合IEEE754
标准双精度表示,拥有16位精度,指数最大达到10^308。
原子
常量,用来表示某些东西的名字。以(:)开头,随后跟着一个原子单词或者Elixir
运算符。
(原子的名字就是它的值,俩个同名原子总是相等的。)
:ok
:is_binary?
:var@2
:<>
:===
:”func/3”
:”long john silver”
区间
区间被表示为,开始
-结束
,开始结束可以是任意值类型。但是如果你想遍历区间,两端必须是整数。
1..10
正则表达式
Elixir
支持正则表达式,写作~r{regexp}或者~r{regexp}opts,{和}作为分隔符。
可用Regex
模块操作正则表达式。1
2iex>Regex.run ~r{[aeiou]}, "caterpillar"
["a"]
系统类型
PID和端口
PID
是本地或者远程的进程的引用。(当前PID值可以通过self获得。)
端口是读/写资源的引用。
引用
make_ref 函数用于创建全局唯一的引用。
集合类型
元组
表示一组有序元素的集合。
一对花口号内,元素用逗号隔开。
{1, 2}
{:ok, 42, “next”}
{:error, :enoent}
列表
元组,更像是通常意义上的数组。
而列表是一种链式的数据结构,或者我们可以直接称之为链表。
列表适合线性遍历,随机访问会很费时。
列表有一些方便的运算符:
1 | iex> [1, 2, 3] ++ [4, 5, 6] #链接 |
关键字列表
因为我们常常需要一组键值对,Elixir
提供了一种简写方式。
[name: “Dave”, city: “Dallas”, age: “28”]
Elixir
将其转换成一个由双值元组组成的列表:
[{name: “Dave”}, {city: “Dallas”}, {age: “28”}]
另,当关键字列表作为函数调用最后一个参数时,允许省略方括号。
Db.save record, {name: “Dave”}, {city: “Dallas”}
散列表
一组键值对的集合,格式:
%{key => value, key => value}
为何既有散列表又有关键字列表呢。散列表的键 不能相同,而关键字列表允许存在重复的键。散列表更高效,尤其在数量不断增加的时候。
访问数据:1
2
3
4iex> states = %{"AL" => "Alabama", "WI" => "Wisconsin"}
%{"AL" => "Alabama", "WI" => "Wisconsin"}
iex> states["AL"]
"Alabama"
如果是原子类型,可以使用点符号
#:green
colors.green
二进制
有时候你需要访问你的数据是一个位,或者字节。
例如JPEG 和 MP3 文件头部包含一些字段,可能在单个字节内放置两到三个值。
二进制写法:<< 和 >> 之间。1
2
3
4iex> bin = <<1, 2>>
<<1, 2>>
iex> byte_size bin
2
也可以通过修饰符控制类型和每个字段大小。1
2
3
4iex> bin = <<3 :: size(2), 5 :: size(4), 1 :: size(2)>>
<<213>>
iex> IO.format("~-8.2b~n", :binary.bin_to_list(bin))
11010101
其他
真值
true false nil 三个来表示。
true 等同于 :true
运算符
例如:
a === b #严格相等,1 === 1.0 为假
a !== b #严格不等, 1 !== 1.0 为真
a == b #值相等,1 == 1.0为真。
a != b #值不等,1 != 1.0 为假
a > b #正常比较
a >= b
a < b
a <= b
布尔运算符
优先计算第一个参数的值。
a
or
b # a 真则真,否则求b
aand
b # a 假则假, 否则求bnot
a # a为真,则假,否则为真
松弛的布尔运算符
接受任意类型的值,任何除了nil
或者false
的值都被解释成真。
a || b # a真则为 a,否则为 b
a && b # a真则为 b,否则为 b
!a # a真则为 假,否则为 真
算数运算符
+ - * / div rem
整数除法会返回浮点数结果,采用div(a,b)可以求得整数结果。
rem
是求余运算,被当做函数来使用。rem(11, 3) => 2
链接运算符
binary1 <> binary2 #链接两个二进制
list1 ++ list2
list1 -- list2
in 运算符
a in enum #测试 a 是否在枚举中
代码规范
Elixir
的标识符由大小写字母,数字和下划线组成,可以以问好或者感叹号结尾。- 模块,记录,协议,行为的名称大写字母开头,并驼峰式命名。其他标识符以小写字母或者下划线开头,通常用下划线分隔单词。
- 源文件UTF-8编码,但是标识符智能 ASCII 字符。
- 习惯上,源文件采用两格缩进,空格而非制表符。
- 注释以符号 # 开始。
- 参考 编码规范