Elixir-基础-内置类型

Elixir内置类型有:

  • 值类型
    • 任意大小的整数
    • 浮点数
    • 原子
    • 区间
    • 正则表达式
  • 系统类型
    • PID和端口
    • 引用
  • 集合类型
    • 元组
    • 列表
    • 散列表
    • 二进制

Elixir里其实 函数 也是类型。

值类型

整数

整数字面量可被写作十进制(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
2
iex>Regex.run ~r{[aeiou]}, "caterpillar"
["a"]

系统类型

PID和端口

PID是本地或者远程的进程的引用。(当前PID值可以通过self获得。)
端口是读/写资源的引用。

引用

make_ref 函数用于创建全局唯一的引用。

集合类型

元组

表示一组有序元素的集合。
一对花口号内,元素用逗号隔开。

{1, 2}
{:ok, 42, “next”}
{:error, :enoent}

列表

元组,更像是通常意义上的数组。
而列表是一种链式的数据结构,或者我们可以直接称之为链表。
列表适合线性遍历,随机访问会很费时。

列表有一些方便的运算符:

1
2
3
4
5
6
iex> [1, 2, 3] ++ [4, 5, 6] #链接
[1, 2, 3, 4, 5, 6]
iex> [1, 2, 3] -- [1, 2] #差集
[3]
iex> 1 in [1, 2, 3] #属于
true

关键字列表

因为我们常常需要一组键值对,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
4
iex> states = %{"AL" => "Alabama", "WI" => "Wisconsin"}
%{"AL" => "Alabama", "WI" => "Wisconsin"}
iex> states["AL"]
"Alabama"

如果是原子类型,可以使用点符号

#:green
colors.green

二进制

有时候你需要访问你的数据是一个位,或者字节。
例如JPEG 和 MP3 文件头部包含一些字段,可能在单个字节内放置两到三个值。
二进制写法:<< 和 >> 之间。

1
2
3
4
iex> bin = <<1, 2>>
<<1, 2>>
iex> byte_size bin
2

也可以通过修饰符控制类型和每个字段大小。

1
2
3
4
iex> 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
a and b # a 假则假, 否则求b
not 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 是否在枚举中

代码规范

  1. Elixir的标识符由大小写字母,数字和下划线组成,可以以问好或者感叹号结尾。
  2. 模块,记录,协议,行为的名称大写字母开头,并驼峰式命名。其他标识符以小写字母或者下划线开头,通常用下划线分隔单词。
  3. 源文件UTF-8编码,但是标识符智能 ASCII 字符。
  4. 习惯上,源文件采用两格缩进,空格而非制表符。
  5. 注释以符号 # 开始。
  6. 参考 编码规范
看官赏点饭钱可好~