collections - pop 是否抛出异常?

标签 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 五次:根据文档,这不应该起作用。但是,我没有得到异常,而是得到了 nil。

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

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

基本上我想知道我是否应该在这里“保护”自己免受异常的影响,或者我是否可以安全地假设 pop'ing 一个空队列将始终返回一个空队列(这将与文档相矛盾)。

最佳答案

您是对的,文档字符串中确实存在矛盾。目前,弹出一个空队列会得到一个空队列。根据 the source of PersistentQueue 中的评论判断,核心开发人员似乎正在讨论所需的行为。 :

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);
}

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

关于collections - pop 是否抛出异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15537505/

相关文章:

java - 更改包含特殊字符的字符串的排序顺序(例如 "_")

Java Collections 使用正则表达式过滤元素

Clojure 不进行 nil 检查

clojure - 在 webnoir 中以编程方式获取主机地址

java - 使用compareTo()从文件读取、标记化、排序不起作用?

java - HashMap发生碰撞时如何取值?

Go range over channel 死锁问题,我应该关闭 channel 吗?

goroutine 等待 channel 的响应并继续

java - 当第二阶段对第一阶段结果值不感兴趣时​​的 CompletionStage 链接

clojure - 有没有更好的方法来映射除第一项之外的所有项?