我正在尝试向 a 添加一个项目Vec<T>
,调用一个函数并等待它。我仍然对所有权和借用规则耿耿于怀。我明白以下内容不起作用:
pub async fn begin_session(&mut self, stream: TcpStream) {
let session = Session::new(stream);
self.sessions.push(session);
session.start_receiver().await; // obviously, won't work
}
Run Code Online (Sandbox Code Playgroud)
我在下面提出的解决方案对我来说似乎并不理想(或线程安全):
pub async fn begin_session(&mut self, stream: TcpStream) {
let session = Session::new(stream);
self.sessions.push(session);
let session = self.sessions.last().unwrap();
session.start_receiver().await; // That works.
}
Run Code Online (Sandbox Code Playgroud)
是否有一个函数Vec<T>
既执行 apush(T)
又返回T
?
对我来说似乎并不理想(或线程安全)
如果优化器没有意识到unwrap()
总是会成功,那么它可能并不理想。
然而,线程安全在这里不起作用:如果您打算稍后共享该Vec
或您的Self
内容,则必须以某种方式处理该问题。
是否有一个函数
Vec
可以执行 apush(T)
然后也返回T
?
如果存在,那么这样的方法很可能会返回 a&T
或 a &mut T
,然后您可以根据需要复制或克隆它们。其他人可能更愿意返回索引。根据您的具体需要,有很多可能性。
无论哪种方法最适合您的项目,请记住您可以自己将方法添加到Vec
. 例如:
trait PushReturn<T> {
fn push_return(&mut self, t: T) -> &mut T;
}
impl<T> PushReturn<T> for Vec<T> {
fn push_return(&mut self, t: T) -> &mut T {
self.push(t);
self.last_mut().unwrap()
}
}
Run Code Online (Sandbox Code Playgroud)