【问题标题】:Clojure merge record typeClojure 合并记录类型
【发布时间】:2017-05-17 00:38:35
【问题描述】:

似乎将记录作为第一个参数传递给merge 总是返回一个 同类记录:

(defrecord X [a b c])
(merge (X. 1 2 3) {:d 4 :e 5})        ;; #my_ns.X{:a 1, :b 2, :c 3, :d 4, :e 5}
(merge {:z 0} (X. 1 2 3) {:d 4 :e 5}) ;; {:z 0, :a 1, :b 2, :c 3, :d 4, :e 5}

merge的实现,好像依赖conj

(conj (X. 1 2 3) [:z 0]) ;; #my_ns.X{:a 1, :b 2, :c 3, :z 0}

assoc 也可以:

(assoc (X. 1 2 3) :z 0) ;; #my_ns.X{:a 1, :b 2, :c 3, :z 0}

我可以依赖它的行为:

  • conj的情况下?
  • merge的情况下?
  • assoc的情况下? (我认为是的,因为这似乎用于 StuartSierra/组件相当重)

【问题讨论】:

标签: clojure


【解决方案1】:

对于 conj 和 assoc,我肯定会说是的,你可以依赖它,因为这些函数的存在主要是为了调用你的集合的多态 IPersistentCollection/consAssociative/assoc 方法。我不太确定是否依赖它进行合并,因为它不是“主要”关于多态调度。

但总的来说,Clojure 并没有真正的“语言律师”,因为除了“规范的 Clojure 实现做什么?”之外没有其他规范。因此,虽然尽量避免依赖实现细节很好,但并不总是清楚什么是实现细节以及什么是“合同”。我想说的是,从务实的角度来看,merge 不太可能很快改变实现,并且依靠它来使用它的第一个参数的多态函数可能对你自己没有什么伤害。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 2011-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多