我想维护一个频道集合,能够添加和删除频道。是否定义了相等,我可以正确地values = {};
和conj
?
换句话说,总是会有效吗?
disj
答案 0 :(得分:5)
是的,这是真的,改变它会破坏一切。
如果频道是相同的chan对象,则频道为identical?
,因此在所有情况下均相等。所有其他的chans比较明确 not 相等,这对你有好处。您希望删除删除您要求删除的确切 chan而不是具有相同内容的等效chan。幸运的是,不相同的chan也不相等
user> (= (chan) (chan))
false
user> (identical? (chan) (chan))
false
user> (identical? my-chan-1 (chan))
false
user> (identical? my-chan-1 my-chan-1)
true
user>
user> (= my-chan-1 my-chan-1)
true
在一般的“Clojure世界”中,对于身份而不是值的所有事物,同样的属性也是如此。身份具有随时间变化的值,因此如果两个identities在您提出的时刻碰巧包含相同的值,那么它们就没有意义,即使这可能只适用于您而且从不为了其他人。比较身份中的价值观更有意义。例如像chans,具有相同值的原子也不相等这是clojure的基本属性,永远不会改变。
user> (let [a (atom 1)]
(= a a))
true
user> (= (atom 1) (atom 1))
false
如果您希望通过将您想要删除的确切chan作为disj的参数移除来删除它们,就像上面所做的那样,而不是像“删除其中包含42的通道”这样的其他概念
如果我们进行相同的设置:
user> (require '[clojure.core.async :refer [<! <!! >! chan]])
nil
user> (def chan-collection (atom #{}))
#'user/chan-collection
user> (def my-chan-1 (chan))
#'user/my-chan-1
user> (def my-chan-2 (chan))
#'user/my-chan-2
user> (swap! chan-collection conj my-chan-1 my-chan-2)
#{#object[clojure.core.async.impl.channels.ManyToManyChannel 0x35b61c71 "clojure.core.async.impl.channels.ManyToManyChannel@35b61c71"] #object[clojure.core.async.impl.channels.ManyToManyChannel 0x240e86d5 "clojure.core.async.impl.channels.ManyToManyChannel@240e86d5"]}
然后要求删除“空陈”:
user> (swap! chan-collection disj (chan))
#{#object[clojure.core.async.impl.channels.ManyToManyChannel 0x35b61c71 "clojure.core.async.impl.channels.ManyToManyChannel@35b61c71"] #object[clojure.core.async.impl.channels.ManyToManyChannel 0x240e86d5 "clojure.core.async.impl.channels.ManyToManyChannel@240e86d5"]}
我们可以验证它什么都不做。