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)
是的,这是真的,改变它会破坏一切.
通道是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)
我们可以验证它什么都不做.
| 归档时间: |
|
| 查看次数: |
86 次 |
| 最近记录: |