Rust向Vec推送特定生命周期元素时的生命周期编译错误解决
Rust生命周期问题:格式化字符串转字节追加到Response Headers的解决过程
我尝试将格式化字符串转换为字节后追加到Response结构体的headers字段时,持续遇到生命周期相关的编译错误,以下是具体的代码、错误信息、尝试的解决方式及最终方案:
原代码
pub struct Response<'a> { status_line: &'a [u8], headers: Vec<&'a [u8]>, contents: &'a [u8], } impl<'a> Response<'a> { fn new() -> Response<'a> { Response { status_line: OK_STATUS, headers: vec![b"\0", b"\0"], contents: &[b'\0'], } } fn build(&mut self) { let mut v: Vec<u8> = Vec::new(); v.extend(self.status_line); let b: &'a [u8] = format!("Content-Length: {}\r\n", self.contents.len()).as_bytes(); self.headers.push(b); for h in self.headers.iter() { v.extend(*h); } v.extend(self.contents); } }
编译错误信息
error[E0716]: temporary value dropped while borrowed --> src/lib.rs:23:27 | 9 | impl<'a> Response<'a> { | -- 生命周期 `'a` 在此处定义 ... 23 | let b: &'a [u8] = format!("Content-Length: {}\r\n", self.contents.len()).as_bytes(); | -------- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 临时值在该语句结束时被释放 | | | | | 创建了一个临时值,该值在仍被使用时被释放 | 类型注解要求该借用的生命周期为 `'a` | = note: 此错误源自宏 `format`(在 Nightly 版本中,使用 -Z macro-backtrace 获取更多信息) 有关此错误的更多信息,请尝试 `rustc --explain E0716`。
尝试过的写法(均未解决)
第一种写法,依旧提示“s生命周期不足”:
let n = self.contents.len(); let s = format!("Content-Length: {}\r\n", n); let b = s.as_bytes();
第二种写法,同样失败:
let n = self.contents.len(); let s: &'a String = &format!("Content-Length: {}\r\n", n); let b = s.as_bytes();
最终解决方案
参考@nwlon和@John Kugelman的方案,修改Response结构体的字段类型,让结构体拥有数据所有权,从根源上避免生命周期问题:
pub struct Response<'a> { status_line: &'a [u8], headers: Vec<u8>, contents: Vec<u8>, } impl<'a> Response<'a> { fn new() -> Response<'a> { Response { status_line: OK_STATUS, headers: Vec::<u8>::new(), contents: Vec::<u8>::new(), } } fn build(&mut self) { let mut output: Vec<u8> = Vec::new(); output.extend(self.status_line); self.headers .extend(format!("Content-Length: {}\r\n", self.contents.len()).as_bytes()); output.extend(&self.headers); output.extend(&self.contents); } }
内容的提问来源于stack exchange,提问作者Hackerman
相关产品推荐
相关产品推荐

