是否期望身份返回与其论点不同的东西?

Sam*_*tep 5 equality clojure nan

这是一个调用identity更改返回值的示例,在我看来,这表明文档字符串"返回其参数".并非完全如此:

(let [x Double/NaN] (identical? x x)) ;=> false
(let [x (identity Double/NaN)] (identical? x x)) ;=> true
Run Code Online (Sandbox Code Playgroud)

这是预期的吗?或者它是identity某种功能的错误?

Ala*_*son 8

您似乎已经找到了一个边缘案件涉及identity,identical?和原始VS对象相等.请注意,在Java中,java.lang.Double/NaN是一个原语:

public static final double NaN
Run Code Online (Sandbox Code Playgroud)

但是相同的比较Java对象:

; clojure.core
(defn identical?
  "Tests if 2 arguments are the same object"
  {:inline (fn [x y] `(. clojure.lang.Util identical ~x ~y))
   :inline-arities #{2}
   :added "1.0"}
  ([x y] (clojure.lang.Util/identical x y)))

// clojure/lang/Util.java
static public boolean identical(Object k1, Object k2){
    return k1 == k2;
}
Run Code Online (Sandbox Code Playgroud)

尝试使用此技巧将NaN强制为Double对象而不是未装箱的原语:

tupelo.core=> (let [x (Double. Double/NaN)] 
  (spyxx x) 
  (identical? x x))

x => java.lang.Double->NaN
true
Run Code Online (Sandbox Code Playgroud)

我怀疑原始NaN的自动装箱可能/可能不会发生在不同的用例中,这是你所看到的差异的原因.