user=> (rseq [:a :b])
(:b :a)
user=> (rseq (rseq [:a :b]))
ClassCastException clojure.lang.APersistentVector$RSeq cannot be cast to
clojure.lang.Reversible clojure.core/rseq (core.clj:1532)
rseq
为什么不能接受先前对rseq
的调用的结果?我在文档字符串中读到,该参数必须(实际上是“可以是”)是向量或排序映射,并且上面的内容表明该参数不能是
RSeq
,因此我已经知道这一点。我想知道的是:此限制是否有充分的理由?仅仅是一个疏忽,还是这种限制提供了一些重要的好处?此外,除了从未调用
rseq
之外,还有其他便捷的解决方法吗?很难知道,当您从一个函数返回RSeq
时,其他地方的其他某个函数是否可能在其上调用rseq
。我之所以问是因为看到我的代码由于如此令人惊讶的原因而抛出异常令人沮丧s。如果我知道为什么这样做有意义,那么我可能不太可能犯此类错误。
最佳答案
您不能在seq上调用rseq
,因为您需要一个具有恒定时间随机访问权的输入集合,以完全实现rseq
的恒定时间性能特征,并且seqs从头到尾只能提供有效的访问(迭代)。
在rseq
的结果上调用rseq
不能特殊情况下返回原始集合,因为原始集合永远不会是一个序列。而且,如果在RSeq上调用rseq
将返回(seq coll)
,则支持(rseq (drop x (rseq coll)))
并不容易。可能正是这些复杂因素使语言实现者根本无法支持“递归” rseq。
如果需要常规的反转功能,请使用reverse
-这会比较慢。如果可以,您可能只想保留对(seq coll)
和(rseq coll)
的引用。