如何将借来的值保存到 Rust 中的结构字段
How to hold borrowed value to struct's filed in Rust
我只想在结构中使用 tokio::net::TcpStream.split
方法并将其保留为它的字段变量,但我得到了错误 error[E0597]: 'stream' does not live long enough
。当我试图将借来的值保存到结构的字段(如 Struct std::path::Path
)时,我多次遇到此类问题。我知道 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
必须至少与 return 值一样长).但是,如果您检查 the source,它会显示 ReadHalf
和 WriteHalf
生命周期(以及为什么它们被允许从函数签名中删除)。
我只想在结构中使用 tokio::net::TcpStream.split
方法并将其保留为它的字段变量,但我得到了错误 error[E0597]: 'stream' does not live long enough
。当我试图将借来的值保存到结构的字段(如 Struct std::path::Path
)时,我多次遇到此类问题。我知道 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
必须至少与 return 值一样长).但是,如果您检查 the source,它会显示 ReadHalf
和 WriteHalf
生命周期(以及为什么它们被允许从函数签名中删除)。