爲什麼Clojure中的assoc
和dissoc
的返回類型在參數爲記錄時存在差異?我的意思是assoc
'不存在的密鑰仍然會返回一條記錄,但現有密鑰的dissoc
會返回一個映射。Clojure記錄上的關聯和解離
但是,從某種意義上說,兩者都應該產生一張地圖或一條記錄,但不會表現出不同的行爲。這種不相似的原因是什麼?
爲什麼Clojure中的assoc
和dissoc
的返回類型在參數爲記錄時存在差異?我的意思是assoc
'不存在的密鑰仍然會返回一條記錄,但現有密鑰的dissoc
會返回一個映射。Clojure記錄上的關聯和解離
但是,從某種意義上說,兩者都應該產生一張地圖或一條記錄,但不會表現出不同的行爲。這種不相似的原因是什麼?
記錄實例保證包含記錄定義中聲明的所有字段。
當聲明的字段從實例中刪除時,這個保證將被違反。因此返回一張地圖。
顯然他們不保證排除未在記錄定義中聲明的所有字段,因此可以將新字段添加到實例中。
只有當您的dissoc
其中一個預定義字段時,記錄纔會轉換爲普通clojure地圖。這是非常合理的行爲,因爲記錄不能有未定義的字段。
考慮下面的代碼:
(defrecord Point [x y])
(def p (Point. 1 2)) ; => Point{:x 1, :y 2}
(assoc p :x 3) ; => Point{:x 3, :y 2}
(dissoc p :x) ; => {:y 2}
(assoc p :z 3) ; => Point{:x 1, :y 2, :z 3}
(dissoc p :z) ; => Point{:x 1, :y 2}
(-> p
(assoc :z 3) ; => Point{:x 1, :y 2, :z 3}
(dissoc :z)) ; => Point{:x 1, :y 2}
正如你所看到的,assoc
只要它滿足Point
定義dissoc
返回一個記錄。
加1包括例子 –