给定集合的数据结构,测试两个集合是否相等似乎是一项理想的任务,并且实际上许多实现都允许这样做(例如python中的内置集合)。
有不同的设置实现了二郎:sets
,ordsets
,gb_sets
。他们的文档没有指出是否可以使用术语比较(“ ==”)来测试相等性,也没有提供用于测试相等性的显式功能。
某些幼稚的情况似乎允许使用“ ==”进行相等性测试,但是我有一个更大的应用程序可以在其中生成sets
且gb_sets
相等(使用下面的函数进行测试),但不将其与“ ==”进行比较。对于ordsets
,它们总是比较相等。不幸的是,对于相等集不等于“ ==”的情况,我还没有找到产生最小示例的方法。
为了可靠地测试相等性,我基于以下关于集合相等性的定理使用以下函数:
%% @doc Compare two sets for equality.
-spec sets_equal(sets:set(), sets:set()) -> boolean().
sets_equal(Set1, Set2) ->
sets:is_subset(Set1, Set2) andalso sets:is_subset(Set2, Set1).
Run Code Online (Sandbox Code Playgroud)
我的问题:
sets
在给出上述代码的情况下,如何生成一个最小示例,其中“ ==”不等于,但集合相等?对问题2的一些思考:
有关sets
状态的文档,“未定义集合的表示形式”。其中,作为ordsets
状态的文档,“一个ordset是一个集合的表示”。上的文档gb_sets
未提供任何可比的指示。下面的评论,从该源代码sets
实现,似乎重申从文档的声明:
请注意,由于键的顺序未定义,我们可以在存储桶中自由地对键进行重新排序。
我的解释是,在Erlang中用“ ==”进行的术语比较适用于集合的表示,即两个集合仅在表示相同时比较相等。这将解释不同集合实现的不同行为,但也将进一步说明为什么没有显式的相等比较的问题。
在具有erlang:set_cookie/2
它的节点上设置cookie时,可以为不同的节点设置不同的cookie.有没有办法显示哪个cookie为哪个节点设置?
调用erlang:get_cookie/1
不显示此信息,仅显示"默认"cookie.
例:
使用cookie启动NodeA,使用带有cookie foo
的NodeB 启动bar
.在NodeA上现在设置与基站通信时使用的cookie bar
调用erlang:set_cookie(NodeB, bar)
.Ping现在工作正常,没有"连接尝试不允许的节点..."错误.erlang:get_cookie()
然而,调用NodeA仍会显示"默认"cookie foo
.如何找到为NodeB设置的cookie?
使用半连接的连接,我的意思是客户端的调用connect()
成功返回的连接,但服务器调用accept()
没有.这可以通过以下方式发生:客户端调用connect()
,从而生成SYN
到服务器的数据包.服务器进入状态SYN-RECEIVED
并向SYN-ACK
客户端发送数据包.这会导致客户端回复ACK
,进入状态ESTABLISHED
并从connect()
呼叫返回.如果最终ACK
丢失(或忽略,由于在服务器上,这可能是更可能的情况全接受队列),服务器仍处于状态SYN-RECEIVED
和accept()
不返回.由于与SYN-RECEIVED
状态相关的超时SYN-ACK
将重新发送,允许客户端重新发送ACK
.如果服务器能够ACK
最终处理,它也将进入状态ESTABLISHED
.否则它最终将重置连接(即发送RST
到客户端).
您可以通过在单个侦听套接字上启动大量连接来创建此方案(如果不调整积压工作tcp_max_syn_backlog
).有关更多详细信息,请参阅此问题和本文.
我进行了几次实验(使用此代码的变体)并观察了一些我无法解释的行为.所有使用Erlang gen_tcp
和当前Linux 执行的实验,但我强烈怀疑答案并非特定于此设置,所以我试图在这里保持更一般.
connect()
- >等 - > send()
- >receive()
我的出发点是从客户端建立连接,等待1到5秒,向服务器发送"Ping"消息并等待回复.通过这种设置,我观察到当我有一个半连接时receive()
失败并出现错误closed
.在send()
半连接的连接期间从未出现过错误.您可以在此处找到有关此设置的更详细说明.
connect()
- >漫长的等待 - > send()
要看,如果我在半连接的连接上发送数据时可能会出错,我会在发送数据前等待4分钟.4分钟应涵盖与半连接相关的所有超时和重试.仍然可以发送数据,即send() …
根据Erlang类型和函数规范,约束约束中函数的输出类型::
可以when
在-spec
属性的一部分中使用:
-spec id(X) -> X when X :: tuple().
Run Code Online (Sandbox Code Playgroud)
为了向后兼容,还可以使用:
-spec id(X) -> X when is_subtype(X, tuple()).
Run Code Online (Sandbox Code Playgroud)
但不鼓励使用is_subtype(不建议使用).什么是最后一个需要使用is_subtype而不是::?的Erlang版本?