Erlang Thursday – queue:head/1

今天的Erlang Thursday我们继续挖掘Erlang的queue模块的Okazaki API,这次来看看queue:head/1.

queue:head/1 入参是一个队列,它的输出是这个队列的第一个元素。

1
2
3
4
5
6
Queue = queue:from_list([1, 2, 3, 4, 5]).
% {[5,4],[1,2,3]}
queue:head(Queue).
% 1
Queue.
% {[5,4],[1,2,3]}

上述例子显示,queue:head/1 函数没有修改原来的队列,而仅是返回它的第一个元素。

因为 queue:head/1 仅仅是返回队列头部能找到的值,而且不是一个标签元组,如果我们尝试从一个空的队列获取它的头部元素则会抛出一个错误。

1
2
3
4
5
6
EmptyQueue = queue:new().
% {[],[]}
queue:head(EmptyQueue).
%** exception error: empty
% in function queue:head/1
% called as queue:head({[],[]})

为了安全起见,让我们不在一个空队列上运行该函数而造成抛出异常,queue模块也定义了一个函数 queue:is_empty/1 ,你可以用它来检查一个队列是否为空。

1
2
queue:is_empty(EmptyQueue).
% true

像 queue:cons/2 和Okazaki API的其它函数一样,模块里也有一个函数queue:dash (head单词倒过来写),它从队列获取最后一个元素,它也是 queue:last/1 的别名函数。

1
2
3
4
queue:daeh(Queue).
% 5
queue:last(Queue).
% 5

如果你调用 queue:dash/1 和 queue:last/1 的时候用空队列做入参也会引起错误。

1
2
3
4
5
6
7
8
queue:daeh(EmptyQueue).
% ** exception error: empty
% in function queue:get_r/1
% called as queue:get_r({[],[]})
queue:last(EmptyQueue).
% ** exception error: empty
% in function queue:get_r/1
% called as queue:get_r({[],[]})

如果我们仔细看 queue:dash/1 和 queue:last/1 引起的错误,我们看到这个错误来自扩展API的 queue:get_r/1 。如果我们仔细看 queue:get_r/1 的执行情况,他看起来像 queue:tail/1 和 queue:dash/1 ,而这两个函数真的仅是 queue:get_r/1 别名函数。

1
2
3
4
5
6
7
8
9
10
queue:get_r(Queue).
% 5
queue:get_r(EmptyQueue).
% ** exception error: empty
% in function queue:get_r/1
% called as queue:get_r({[],[]})
queue:get_r(Queue).
% 5
Queue.
% {[5,4],[1,2,3]}

原文链接: https://www.proctor-it.com/erlang-thursday-queue-head-1/