-opaque -type -export_type -spec
Erlang 类型及函数约束规范
Erlang是一种动态类型语言,不过可以通过一些特殊的语法声明一个由Erlang term组成的类型集合,这个集合可用于约束某字段类型或者某函数的参数类型和返回值类型。
类型及函数约束规范可用于:记录接口、使用代码静态类型分析工具(Dialyzer)、生成程序文档(EDoc)。
类型约束语法
所有的类型约束都是由内置类型、自定义类型或者类型实例构建;
整数和原子类型,允许使用类型实例来定义;
当类型约束中既存在类型实例又存在预定义类型,类型实例将被预定义类型覆盖。
1 | atom() | 'bar' | integer() | 56 |
any()可覆盖任何类型none()可被任何类型覆盖
1 | %% 顶部类型,可覆盖任何类型 |
内置类型
| Build-in type | Defined as | ||
|---|---|---|---|
term() |
any() |
||
binary() |
<<_:_*8>> |
||
bitstring() |
<<_:_*1>> |
||
boolean() |
'true' | 'false' |
||
byte() |
0..255 |
||
char() |
0..16#10ffff |
||
nil() |
[] |
||
number() |
integer() | float() |
||
list() |
[any()] |
||
maybe_improper_list() |
maybe_improper_list(any(), any()) |
||
nonempty_maybe_improper_list() |
nonempty_maybe_improper_list(any(), any()) |
||
nonempty_list() |
nonempty_list(any()) |
||
string() |
[char()] |
||
nonempty_string() |
[char(), ...] |
||
iodata() |
iolist() | binary() |
||
iolist() |
maybe_improper_list(byte() | binary() | iolist(), binary() | []) |
||
function() |
fun() |
||
module() |
atom() |
||
mfa() |
{module(), atom(), arity()} |
||
arity() |
0..255 |
||
identifier() |
pid() | port() | reference() |
||
node() |
atom() |
||
timeout() |
'infinity' | non_neg_integer() |
||
no_return() |
none()一直循环不返回的函数 |
||
| ### 在record声明中声明field类型约束 | |||
|
|||
无论record声明是否包含类型约束,record被声明后,就可以使用#rec{}作为约束类型 |
|||
同样可以使用#rec{f1 :: non_neg_integer()}对field类型进行约束 |
|||
| ### 声明自定义类型约束 | |||
|
|||
无论是官方文档还是各类教程都不建议使用opaque声明自定义类型约束,用type就好:) |
|||
| ### 声明函数参数与返回值约束 | |||
|