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
из одной функции, может ли какая-то другая функция в другом месте называть rseq
.
Я прошу, потому что это разочаровывает, когда мои ошибки исключают код для такой неожиданной причины. s. Если бы я знал, почему это имеет смысл, я мог бы с меньшей вероятностью совершить подобные и подобные ошибки.
Спасибо! Я думал, что «RSeq» (объект, возвращаемый 'rseq') может быть легко изменен в течение постоянного времени, просто разворачивая' RSeq', но я думаю, что вы прибили его: вектор не является seq. Я все еще новичок в Clojure, и я все еще часто неправильно читаю «возвращает seq», поскольку «возвращает что-то последовательное, как вектор», а не «возвращает что-то вроде итератора». –
Еще одна мысль: не удалось ли 'RSeq' быть реверсивным в постоянное время, возвращая seq на исходный вектор или отсортированную карту? –
Да, это может быть сделано для работы, но только для оригинального RSeq. Вы не можете легко поддерживать (например, rseq (drop 1 (rseq coll)). –