rust - 如何在Rust中将借来的值保存到struct字段中

标签 rust ownership tokio

我只想在结构中使用tokio::net::TcpStream.split方法并将其保留为字段变量,但是出现了error[E0597]: 'stream' does not live long enough错误。当我尝试保留借来的值到Struct std::path::Path之类的struct字段时,我会多次遇到此类问题。我知道Path问题将通过使用PathBuf解决,但我不确定这次。你能给我一个建议使其工作吗?

use tokio::net::TcpStream;
use tokio::net::tcp::{ReadHalf, WriteHalf};

struct TT<'a>{
    pub reader: Option<ReadHalf<'a>>,
    pub writer: Option<WriteHalf<'a>>,
}

impl<'a> TT<'a> {
    fn set_reader_and_writer(&mut self, mut stream: TcpStream) {
        let (reader, writer) = stream.split();
        self.reader = Some(reader);
        self.writer = Some(writer);
    }
}
$ cargo build                                                                                                                                                                    [master|…4]
    Blocking waiting for file lock on build directory
   Compiling tcpst v0.1.0 (/tmp/tcpst)
error[E0597]: `stream` does not live long enough
  --> src/main.rs:11:32
   |
9  | impl<'a> TT<'a> {
   |      -- lifetime `'a` defined here
10 |     fn set_reader_and_writer(&mut self, mut stream: TcpStream) {
11 |         let (reader, writer) = stream.split();
   |                                ^^^^^^ borrowed value does not live long enough
12 |         self.reader = Some(reader);
   |         -------------------------- assignment requires that `stream` is borrowed for `'a`
13 |         self.writer = Some(writer);
14 |     }
   |     - `stream` dropped here while still borrowed

error: aborting due to previous error

For more information about this error, try `rustc --explain E0597`.
error: could not compile `tcpst`.

最佳答案

问题是流的一半读写都借用了对它们创建的流的引用。在您的代码中,原始流将在函数末尾删除,这将使这些引用无效。最简单的解决方案是将set_reader_and_writer的签名更改为采用&mut stream而不是所有权。

这是一个很容易理解的错误,因为split的签名没有明确表明其生存期(stream的生存期至少应与返回值一样长)。但是,如果您检查the source,它将显示ReadHalfWriteHalf的生存期(以及为什么允许从函数签名中删除它们)。

关于rust - 如何在Rust中将借来的值保存到struct字段中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61405786/

相关文章:

pattern-matching - 预期的字符串,在匹配可选字符串时找到 &str

git - 如何阻止 root 运行 git pull?

rust - 如何创建在tokio::process::Child退出但不关闭stdin的情况下完成的 future

asynchronous - 直接使用Future或包装在异步移动 block 之间的区别

multithreading - 克隆和移动特征

rust - 来自特征和 T 生命周期的 Vec<T> 引用

rust - 如何减少 Rust 中的样板嵌套结果

rust - 如何确定何时应将函数输入参数作为引用?

c++ - 在 C++ 中获取所有权和释放对象的语法指南

types - Rust:Traits 中的通用返回类型,用于返回非对象安全 Traits 的实现