Erlang Thursday – queue:peek/1

今天的Erlang Thursday我们继续研究queue模块来看看扩展API里的 queue:peek/1

queue:peek/1 接收一个队列为入参,如果这个队列是空的,它返回原子 empty ,否则它返回 {value, Item} 元组,其中 Item 是队列的头部元素。

1
2
3
4
5
6
7
8
9
10
QueueOne = queue:from_list([1, 2, 3, 4, 5]).
% {[5,4],[1,2,3]}
queue:peek(QueueOne).
% {value,1}
QueueOne.
% {[5,4],[1,2,3]}
EmptyQueue = queue:new().
% {[],[]}
queue:peek(EmptyQueue).
% empty

queue:peek/1 绝对不会修改入参队列,所以我们可以再一次调用上述例子,或者像下面例子一样多次调用,而我们的入参队列不会被修改。

1
2
3
4
5
6
7
8
9
10
QueueTwo = queue:from_list([a, b, c, d, e, f]).
% {[f,e],[a,b,c,d]}
queue:peek(QueueTwo).
% {value,a}
queue:peek(QueueTwo).
% {value,a}
queue:peek(QueueTwo).
% {value,a}
QueueTwo.
% {[f,e],[a,b,c,d]}

不像上一篇文章里我们看到的 queue:head/1 ,我们可以安全地在入参队列为空的情况下调用 queue:peek/1 函数,而不是获得一个异常。

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

Erlang的 queue 模块也包含函数 queue:peek_r/1 ,它返回入参队列的尾部元素。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
queue:peek_r(EmptyQueue).
% empty
queue:peek_r(QueueOne).
% {value,5}
queue:peek_r(QueueOne).
% {value,5}
queue:peek_r(QueueOne).
% {value,5}
queue:peek_r(QueueTwo).
% {value,f}
QueueTwo.
% {[f,e],[a,b,c,d]}
QueueOne.
% {[5,4],[1,2,3]}
EmptyQueue.
% {[],[]}

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