如何将一个项目推入 Vec 并继续使用它?

Dou*_*nen 5 rust

我正在尝试向 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

Aco*_*orn 5

对我来说似乎并不理想(或线程安全)

如果优化器没有意识到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)