我对identical?
中clojure
的行为感到非常惊讶。
(def a (map identity [:a :b]))
(identical? (rest a) (rest a)); false
知道为什么identical?
会返回false?
答案 0 :(得分:5)
Tests if 2 arguments are the same object
由于rest
在每次调用时都会创建一个新的seq对象,因此其结果不是identical?
。但是,以下是:
(def r (rest (map identity [:a :b])))
(identical? r r) ;; => true
更新:正如@mfikes指出的那样,rest
并不总是会创建新的seq。它在内部调用ISeq.more()
,这是按照seq类型实现的,可能会对列表,向量,惰性seq等产生不同的结果:
(->> [(map identity [:a :b])
(vector :a :b)
(list :a :b)]
(map #(identical? (rest %) (rest %))))
;; => [false false true]
答案 1 :(得分:2)
identical?
是对象相等谓词。如果其参数是相同的对象/原语,则返回true。
使用=
而不是identical?
。
identical?
是正确的工具,例如测试文件结束的标记值。
永远不要使用identical?
来比较Clojure数据结构。即使关键字也不能保证identical?
行为正确。