我的问题是关于循环引用。它与使用交叉光束通道和Select
有关,但很可能更普遍地适用。
我想根据需要创建任意数量的新after
通道,并将它们传递给横梁Select
。现在,我的问题是这个select.recv()
引用了一个频道,而不是移动该频道。
这是我要尝试的工作的简化方法(我希望可以稍后处理的Select
处对此有所帮助的部分)。
fn setup_channels(duration_rx: Receiver<Duration>) {
let mut select = Select::new();
thread::spawn(move || loop {
let duration = duration_rx.recv().unwrap();
let chan = after(duration);
select.recv(&chan);
});
}
error[E0597]: `chan` does not live long enough
好的,很公平。因此,我认为此参考资料必须来自
某处。也许我可以将实际频道值放在Vec
中?
fn setup_channels(input_rx: Receiver<Duration>) {
let mut select = Select::new();
let mut channels = vec![];
thread::spawn(move || loop {
let duration = input_rx.recv().unwrap();
let chan = after(duration);
channels.push(chan);
let last_chan = &channels[channels.len()-1];
select.recv(last_chan);
});
}
否:
error[E0502]: cannot borrow `channels` as mutable because it is also borrowed as immutable
因此,经过一段时间后,我看不到如何获得
select.recv()
接受频道参考。
我该如何解决这个问题?