Erlang 中类型的确切数量是多少?
What's the exact number of types in Erlang?
除了您可以在其他语言中找到的数据原语和结构之外,Erlang 中类型的完整列表是什么?
例如,套接字句柄的类型是什么? ets handle 呢?
另外,哪些类型不能在节点间序列化和交换?我想套接字句柄一定是其中之一吧?
即使在同一节点内的进程之间,套接字句柄也是共享的,对吗?这是无共享原则的例外?
GC 对此类共享内容的行为是什么? Erlang 中的套接字实现是什么?我想这不是港口吧?
erlang中的类型很少,可以参考erlang模块的函数is_???(Term)获取内置的基本类型列表:
- 原子
- 位串
- 浮动
- 函数
- 整数
- 列表
- 地图
- pid
- 端口
- 参考
- 元组
还有第二个列表是从基本类型派生的:
- 二进制:大小是字节大小的倍数的位串
- boolean : 原子 true 和 false
- 数字:整数或浮点数
- record :一个元组,第一项是表示记录名称的原子(编译器使用记录定义通过符号而不是索引访问元组的不同元素)
那么您可以考虑根据这些基本类型的任意组合创建无限数量的类型。在某些程序中,您会看到一些声明,例如:
-type orddict() :: [{Key :: term(), Value :: term()}].
或
-spec is_key(Key, Orddict) -> boolean() when
Key :: term(),
Orddict :: orddict().
Erlang 编译器不直接使用这些信息,它们由 Dializer 等外部工具使用,并不是获取有效代码所必需的。 Erlang 的主要特点不是类型声明,而是模式匹配。因此,如果您调用一个函数并期望 {ok,Value}
或 {error,Reason}
形式的 return 值,您将编写如下内容:
Result = case f(Par) of
{ok,Value} -> resultWhenOk(Value);
{error,Reason} -> resultWhenError(Reason)
end;
或者如果您不关心错误管理:
% get the Name and Age of the employee whose id is Id in a list of people List
% using a function that return a tuple of the form
% {PeopleType, Id, Name,Surname,Age,Sex}
{ok,{employee,Id,Name,_,Age,_}} = find_people(Id,List);
socket为端口类型,内置驱动实现
在同一个节点内,socket可以被多个进程共享;所有进程都可以调用套接字,当所有者进程退出时,套接字将关闭。
当远程进程尝试访问套接字时,我尝试将套接字发送到远程进程(在不同的节点内),例如send(),它会引发错误,原因为 "closed".
除了您可以在其他语言中找到的数据原语和结构之外,Erlang 中类型的完整列表是什么?
例如,套接字句柄的类型是什么? ets handle 呢?
另外,哪些类型不能在节点间序列化和交换?我想套接字句柄一定是其中之一吧?
即使在同一节点内的进程之间,套接字句柄也是共享的,对吗?这是无共享原则的例外?
GC 对此类共享内容的行为是什么? Erlang 中的套接字实现是什么?我想这不是港口吧?
erlang中的类型很少,可以参考erlang模块的函数is_???(Term)获取内置的基本类型列表:
- 原子
- 位串
- 浮动
- 函数
- 整数
- 列表
- 地图
- pid
- 端口
- 参考
- 元组
还有第二个列表是从基本类型派生的:
- 二进制:大小是字节大小的倍数的位串
- boolean : 原子 true 和 false
- 数字:整数或浮点数
- record :一个元组,第一项是表示记录名称的原子(编译器使用记录定义通过符号而不是索引访问元组的不同元素)
那么您可以考虑根据这些基本类型的任意组合创建无限数量的类型。在某些程序中,您会看到一些声明,例如:
-type orddict() :: [{Key :: term(), Value :: term()}].
或
-spec is_key(Key, Orddict) -> boolean() when
Key :: term(),
Orddict :: orddict().
Erlang 编译器不直接使用这些信息,它们由 Dializer 等外部工具使用,并不是获取有效代码所必需的。 Erlang 的主要特点不是类型声明,而是模式匹配。因此,如果您调用一个函数并期望 {ok,Value}
或 {error,Reason}
形式的 return 值,您将编写如下内容:
Result = case f(Par) of
{ok,Value} -> resultWhenOk(Value);
{error,Reason} -> resultWhenError(Reason)
end;
或者如果您不关心错误管理:
% get the Name and Age of the employee whose id is Id in a list of people List
% using a function that return a tuple of the form
% {PeopleType, Id, Name,Surname,Age,Sex}
{ok,{employee,Id,Name,_,Age,_}} = find_people(Id,List);
socket为端口类型,内置驱动实现
在同一个节点内,socket可以被多个进程共享;所有进程都可以调用套接字,当所有者进程退出时,套接字将关闭。
当远程进程尝试访问套接字时,我尝试将套接字发送到远程进程(在不同的节点内),例如send(),它会引发错误,原因为 "closed".