vie*_*bel 2 identity clojure sequence lazy-sequences
我对identical?in 的行为感到非常惊讶clojure.
(def a (map identity [:a :b]))
(identical? (rest a) (rest a)); false
知道为什么identical?返回false?
Tests if 2 arguments are the same object
Run Code Online (Sandbox Code Playgroud)
由于rest在每次调用时都会创建一个新的seq对象,因此其结果不是identical?.但是,以下是:
(def r (rest (map identity [:a :b])))
(identical? r r) ;; => true
Run Code Online (Sandbox Code Playgroud)
更新:正如@mfikes所指出的,rest并不总是创建一个新的seq.它在ISeq.more()内部调用,它是按seq类型实现的,可能会对列表,向量,惰性seq等产生不同的结果:
(->> [(map identity [:a :b])
(vector :a :b)
(list :a :b)]
(map #(identical? (rest %) (rest %))))
;; => [false false true]
Run Code Online (Sandbox Code Playgroud)