Answers:
doall
是你所需要的全部。仅仅因为seq
has类型LazySeq
并不意味着它具有待处理的评估。Lazy seq
缓存它们的结果,因此您需要做的就是seq
一次(像doall
这样)对Lazy进行遍历,以强制全部执行,从而使其变为非Lazy。seq
并没有强制整个集合进行评估。
realized?
。
realize
进行匹配操作realized?
。
contains?
并不关心您是否意识到了惰性序列,因此这可以回答所询问的特定问题,而对问题的标题的回答则较少。
这在某种程度上是分类学的问题。 惰性序列只是列表,向量或图谱的一种类型。因此,答案当然是“这取决于您要获得哪种类型的非延迟序列:
从以下选项中进行选择:
(doall ... )
(apply list (my-lazy-seq)) OR (into () ...)
(vec (my-lazy-seq))
您可以根据自己的需要选择最适合的序列类型。
(vec (my-lazy-seq))
在以下情况下不太好:(vec (json/parse-string "{\"foo\":\"bar\"}")) ;; => [["foo" "bar"]]
由于cheshire
选择从以下位置 生成延迟(json/parse-string)
(json/parse-string-strict)
这个有钱人似乎知道他的伪君子,是绝对正确的。
但是,我认为,使用您的示例,此代码片段可能是此问题的有用补充:
=> (realized? (take 3 (repeatedly rand)))
false
=> (realized? (doall (take 3 (repeatedly rand))))
true
确实类型没有改变,但是实现有了改变
realized?
返回true
。例如(let [r (range) r? (realized? r)] (doall (take 1 r)) [r? (realized? r)]) => [false true]
(.getClass (into '() (take 3 (repeatedly rand))))
doall