除了您可以在其他语言中找到的数据原语和结构外,Erlang中的完整类型列表是什么?
例如,套接字句柄的类型是什么?那ets处理怎么办?
此外,哪些类型不可能在节点之间进行序列化和交换?我认为套接字句柄必须是其中之一,对吗?
即使在同一节点内的进程中,套接字句柄也是共享的,对吧?这是无共享原则的例外吗?
GC针对此类共享内容的行为是什么?那么Erlang中的套接字实现是什么?我认为它不是一个端口,对吧?
答案 0 :(得分:8)
erlang中的类型很少,你可以参考erlang模块的_ ???(Term)函数来获取内置基本类型的列表:
有第二个列表来自基本类型:
然后,您可以考虑根据这些基本类型的任意组合创建无数种类型。在某些程序中,您将看到一些声明,例如:
-type orddict() :: [{Key :: term(), Value :: term()}].
或
-spec is_key(Key, Orddict) -> boolean() when
Key :: term(),
Orddict :: orddict().
这些信息不是由Erlang编译器直接使用的,它们由拨号器等外部工具使用,并不是获取有效代码所必需的。 Erlang的主要特性不是类型声明,而是模式匹配。因此,如果您调用函数并期望返回值为{ok,Value}
或{error,Reason}
的形式,您将编写如下内容:
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);
答案 1 :(得分:-1)
套接字是端口类型,在内置驱动程序中实现。
在同一节点内,套接字可以由多个进程共享;所有进程都可以调用套接字,当所有者进程退出时,套接字将被关闭。
当远程进程尝试访问套接字时,我尝试将套接字发送到远程进程(在不同的节点内),例如send(),它会引发错误,原因是"关闭"。