pop会抛出异常吗?

时间:2013-03-21 00:46:24

标签: collections concurrency clojure

pop函数的文档说:

user> (doc pop)
-------------------------
clojure.core/pop
([coll])
  For a list or queue, returns a new list/queue without the first
  item, for a vector, returns a new vector without the last item. If
  the collection is empty, throws an exception.

但是我似乎无法重现应该抛出异常的行为。

例如,我在队列中添加了三个元素,然后pop五次:根据文档,这不应该有效。但是,我没有例外,我没有。

(peek (pop (pop (pop (pop (pop (conj (conj (conj clojure.lang.PersistentQueue/EMPTY 4) 5) 6)))))))

现在我喜欢很多,而不是在从空队列中尝试pop时返回一个空队列而不是抛出异常但是我想理解为什么行为与doc不同(至少从我从阅读文档中了解到的内容。

基本上我想知道我是否应该“保护”自己免于异常,或者我可以安全地假设pop空队列总是会返回一个空队列(这会与doc相矛盾) )。

1 个答案:

答案 0 :(得分:0)

你是对的,doc字符串中确实存在矛盾。目前,弹出空队列会产生一个空队列。根据{{​​3}}中的评论,核心开发人员似乎正在讨论所期望的行为:

public PersistentQueue pop(){
    if(f == null) //hmmm... pop of empty queue -> empty queue?
        return this;
    //throw new IllegalStateException("popping empty queue");
    ISeq f1 = f.next();
    PersistentVector r1 = r;
    if(f1 == null)
        {
        f1 = RT.seq(r);
        r1 = null;
        }
    return new PersistentQueue(meta(), cnt - 1, f1, r1);
}

我不认为自己安全,假设将来这种行为永远不会改变。