gpt4 book ai didi

clojure - chan 上的平等定义正确吗?

转载 作者:行者123 更新时间:2023-12-01 19:55:11 24 4
gpt4 key购买 nike

我想维护一个 channel 集合,并且能够添加和删除 channel 。是否定义了相等性,以便我可以正确地 conjdisj

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

=> (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
#{}

最佳答案

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

channel 为identical?如果它们是相同的 chan 对象,因此在所有情况下都是相等的。 chan 的所有其他比较都明确相等,这对您有好处。您希望删除确切您要求删除的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 的 channel ”之类的其他概念

如果我们进行相同的设置:

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"]}

我们可以验证它没有执行任何操作。

关于clojure - chan 上的平等定义正确吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30325453/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com