在clojure中,相同的确切行为是什么?

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?

xsc*_*xsc 5

identical?:

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)

  • 虽然`rest`一般不会创建一个新的seq对象,但它确实适用于此序列.例如,它不适用于列表文字. (2认同)