- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想维护一个 channel 集合,并且能够添加和删除 channel 。是否定义了相等性,以便我可以正确地 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
#{}
最佳答案
是的,这是真的,改变它会破坏一切。
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/
Golang 新手在这里。 两者在功能上有区别吗 func randomNumberGenerator() <-chan int { 和 func randomNumberGenerator() ch
我想从一个函数返回一个 []<-chan int 给定的 []chan int,但即使转换也不起作用。 你 可以将 分配给 chan T 或 chan<- T (隐式类型转换)。我不知道为什么你 不能
在golang中,当我们需要等待某事完成时,我们会使用一个channel。 例子: done := make(chan struct{}) go func() { // ... clo
我正在实现一个简单的工作池算法,其中 1 个 Sender(调度程序)将作业发送到 M(Worker)go 例程。为此,它使用一个 channel 的 channel 来为第一个空闲的工作人员分配一个
这是我收到的错误消息: cannot use c.ReceiverChans (type []chan *Message) as type []chan interface {} in functio
package main import "fmt" func x(foo []string, cz chan string) { for i := range foo { cz
刚接触golang,开始写一些基于prometheus client-go的monitor exporter,发现promethues的源码中有这样定义channel var的代码 reloadCh
今天我在学习 channels 和 goroutine of go。我遇到了一些让我困惑的现象。 我的 go 文件如下所示: package main import ( "fmt" ) fun
有如下代码: func consumeQueue(ch *amqp.Channel, q_Name string) (chan amqp.Delivery) { msgs, err := ch
我的问题来自尝试读取 channel ,如果可以的话,或者写它,如果可以的话,使用 select声明。 我知道像 make(chan bool, 1) 这样指定的 channel 被缓冲了,我的部分问
遇到golang channel 的一个问题:发现go 协程读取channel 数据 并没有按照预期进行协作执行。 经过查资料: 使用channel 操作不当导致,channel分 有
我认为它们是一样的,但是The go memory model中有一个这样的词:, 如果 channel 被缓冲(例如,c = make(chan int, 1))那么程序将不能保证打印“hello,
我知道如果有多个“通信”可以在 select 中进行。声明一个是随机选择的。我正在尝试找到一种替代方法,它可以更喜欢一种“交流”而不是另一种。 背景是我正在使用上下文杀死的 channel 上的 go
我想维护一个 channel 集合,并且能够添加和删除 channel 。是否定义了相等性,以便我可以正确地 conj 和 disj ? 换句话说,这总是有效吗? => (def chan-colle
一段时间以来,我一直在尝试理解 Go 中的 channel 。但有一件事让我感到奇怪。当你打电话时究竟发生了什么, for { select { case <-chan: } } 它是
是否可以让函数 funcWithNonChanResult 具有以下接口(interface): func funcWithNonChanResult() int { 如果我想让它在接口(interf
我有一个功能: func f(input interface{}) interface{} { t := reflect.ChanOf(reflect.BothDir, ) c :=
我正在编写一个 python 脚本,我正在尝试获取相机 .chan 光圈值 - 水平和垂直,因为我将使用这些值并将其传输到 Maya 相机中。 但是,即使我打开 .chan,我也只看到几行/列/行或属
我正在尝试调用 name.com API(并且成功了,除了一次调用......当我尝试调用他们的 Search() 方法时,我收到错误。 这是我的代码: func TestExecute() stri
我想了解为什么这种情况会陷入僵局,而另一种情况却不会。 如果我在 goroutine 中关闭 channel ,它工作正常,但如果我在 WaitGroup.Wait() 之后关闭它会导致死锁。 pac
我是一名优秀的程序员,十分优秀!