是否在陈上正确定义了平等?

Joe*_*Joe 2 clojure core.async

我想维护一个频道集合,能够添加和删除频道.被定义平等这样我就可以conj和disj正确的?

换句话说,这总是有效吗?

=> (def chan-collection (atom #{}))
=> (def my-chan-1 (chan))
=> (def my-chan-2 (chan))
=> @chan-collection
#{}
=> (swap! chan-collection conj my-chan-1)
=> @chan-collection
#{#<ManyToManyChannel clojure.core.async.impl.channels.ManyToManyChannel@6ec3a2f6>}
=> (swap! chan-collection conj my-chan-2)
=> @chan-collection
#{#<ManyToManyChannel clojure.core.async.impl.channels.ManyToManyChannel@382830a1>
  #<ManyToManyChannel clojure.core.async.impl.channels.ManyToManyChannel@6ec3a2f6>}
=> (swap! chan-collection disj my-chan-1)
=> @chan-collection
#{#<ManyToManyChannel clojure.core.async.impl.channels.ManyToManyChannel@382830a1>}
=> (swap! chan-collection disj my-chan-2)
=> @chan-collection
#{}
Run Code Online (Sandbox Code Playgroud)

Art*_*ldt 5

是的,这是真的,改变它会破坏一切.

通道是identical?它们是相同的chan对象,因此在所有情况下都是相同的.所有其他的chans比较明显不相同,这对你有好处.您希望删除删除您要求删除的确切陈而不是具有相同内容的等效陈.幸运的是,不相同的chans也不相同

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
Run Code Online (Sandbox Code Playgroud)

在一般的"Clojure世界"中,所有属于身份而不是价值的东西都是如此.身份的价值会随着时间的推移而变化,因此如果两个身份在您提出要求的时刻碰巧包含相同的值,则说两个身份相等是没有意义的,即使这可能只适用于您而且绝不会对其他人有效.比较身份中的价值观更有意义.例如像chans一样,具有相同值的原子也不相等,这是clojure永远不会改变的基本属性.

user> (let [a (atom 1)]
        (= a a))
true
user> (= (atom 1) (atom 1))
false
Run Code Online (Sandbox Code Playgroud)

如果您希望通过将您想要删除的确切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"]}
Run Code Online (Sandbox Code Playgroud)

然后要求删除"空陈":

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"]}
Run Code Online (Sandbox Code Playgroud)

我们可以验证它什么都不做.