【发布时间】:2021-03-07 00:15:29
【问题描述】:
我已尽可能缩小范围。我有一个对Senders 的引用向量,并希望在receive() 完成运行后处理它们。但是,我遇到了终身管理问题。内部结构是Mutex protected 并包含我试图引用的Senders。我使用 Mutex 来获得数据的可变性,我对替代方案持开放态度。关于如何解决这个问题的任何建议?我不想改变receive()的签名。
use std::sync::Mutex;
use std::sync::mpsc;
#[derive(Default)]
struct SaveForLater<'a> {
queue: Vec<(&'a mpsc::Sender<usize>, usize)>,
}
impl<'a> SaveForLater<'a> {
fn send(&mut self, channel: &'a mpsc::Sender<usize>, value: usize) {
self.queue.push((channel, value));
}
}
#[derive(Default)]
struct Forwarder {
data: Mutex<ForwarderData>,
}
#[derive(Default)]
struct ForwarderData {
senders: Vec<mpsc::Sender<usize>>,
}
impl Forwarder {
fn with_capacity(capacity: usize) -> Self {
let mut senders = Vec::new();
for _ in 0..capacity {
let (s,r) = mpsc::channel();
senders.push(s);
}
let data = ForwarderData { senders };
let data = Mutex::new(data);
Self { data }
}
fn receive<'a>(&'a self, value: usize, sender: &mut SaveForLater<'a>) {
match value {
0 => { self.data.lock().unwrap().senders.drain(..); },
_ => {
let data = self.data.lock().unwrap();
sender.send(&data.senders[0], value); },
/*
error[E0597]: `data` does not live long enough
--> src/main.rs:40:30
|
35 | fn receive<'a>(&'a self, value: usize, sender: &mut SaveForLater<'a>) {
| -- lifetime `'a` defined here
...
40 | sender.send(&data.senders[0], value); },
| -------------^^^^------------------- - `data` dropped here while still borrowed
| | |
| | borrowed value does not live long enough
| argument requires that `data` is borrowed for `'a`
*/
}
}
}
fn main() {
let fwd = Forwarder::with_capacity(3);
{
let mut sender = SaveForLater::default();
let value: usize = 42;
fwd.receive(value, &mut sender);
for (s,v) in sender.queue {
s.send(v);
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_main() {
main();
}
}
查看playground中的错误
【问题讨论】:
标签: rust