Clojure 在成龙身上是否正确定义了平等?
我想维护一个频道集合,能够添加和删除频道。是否定义了相等,以便我能正确地Clojure 在成龙身上是否正确定义了平等?,clojure,core.async,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-collectio
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
#{}
=>(def chan集合(atom{}))
=>(def my-chan-1(chan))
=>(def my-chan-2(chan))
=>@chan系列
#{}
=>(交换!chan collection conj my-chan-1)
=>@chan系列
#{#}
=>(交换!chan collection conj my-chan-2)
=>@chan系列
#{#
#}
=>(交换!成龙系列disj my-chan-1)
=>@chan系列
#{#}
=>(交换!成龙系列disj my-chan-2)
=>@chan系列
#{}
是的,这是真的,改变它会破坏一切
如果通道是同一个对象,则通道是相同的,因此在所有情况下都是相同的。Chan的所有其他比较都明显不相等,这对你有好处。您希望删除的是您要求删除的确切chan,而不是具有相同内容的等效chan。所以幸运的是,不相同的通道也不相等
在一般的“Clojure世界”中,相同的属性适用于所有属于身份而非价值的事物。身份具有随时间而变化的价值,因此,如果在您询问时,两个身份碰巧包含相同的价值,那么说它们相等是没有意义的,即使这可能只适用于您,而不适用于其他任何人。比较身份中的值更有意义。例如,像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"]}
我们可以验证它不起任何作用。您没有显示它正在工作吗?我正在显示它今天在我的机器上工作。我的问题是,它被指定工作吗?我不确定你的编辑是完全必要的,raam86。只有一句话的意思很清楚!我想这就是白痴的证明。我之前没有看到它。我没有理由假设
chan
的相等语义。集合的比较基于其内容,而不是其引用相等性chan
不是一个集合,但它是类似的。你可以说两个空的chan
s应该是=
,但不是相同?
。虽然这个例子是可行的,但没有理由认为应该这样做。
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"]}