rust - 为什么 Vec<&str> 在这里缺少生命周期说明符?
问题描述
此代码编译:
struct IntDisplayable(Vec<u8>);
impl fmt::Display for IntDisplayable {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
for v in &self.0 {
write!(f, "\n{}", v)?;
}
Ok(())
}
}
fn main() {
let vec: Vec<u8> = vec![1,2,3,4,5];
let vec_Foo = IntDisplayable(vec);
println!("{}",vec_Foo);
}
虽然这段代码没有:
struct StrDisplayable(Vec<&str>);
impl fmt::Display for StrDisplayable {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
for v in &self.0 {
write!(f, "\n{}", v)?;
}
Ok(())
}
}
fn main() {
let vec: Vec<&str> = vec!["a","bc","def"];
let vec_Foo = StrDisplayable(vec);
println!("{}",vec_Foo);
}
错误信息:
error[E0106]: missing lifetime specifier
--> src/lib.rs:3:27
|
3 | struct StrDisplayable(Vec<&str>);
| ^ expected lifetime parameter
我想要做的是实现fmt::Display
a Vec<&str>
,这通常需要Vec
像这样包装,但是它只适用于Vec<u8>
,为什么替换Vec<u8>
成Vec<&str>
导致这样的编译错误?
解决方案
编译器被告知您正在借用一个值,但不知道它会存在多长时间。它应该是静态的吗?还有什么?
我认为您正在尝试执行以下操作。
struct StrDisplayable<'a>(Vec<&'a str>);
这样,您就明确地告诉编译器字符串将至少与结构一样长,不少于。
您还需要在 trait 的实现中添加生命周期,如果使用 Rust 2018,则可以匿名。
推荐阅读
- wildfly - WildFly 中的管理界面无法访问日志记录配置文件中定义的日志文件
- javascript - CSS 错误行为?on :hover 使用 ~
- vue.js - 将 CoreUI 图标添加到 Vue.js 中的 DevExtreme dxDataGrid 列标题
- sql - PSQL 查询根据条件将记录从一个表插入到另一个表
- laravel - 返回带有以选定方式相关的表的查询
- laravel - Auth::attempt not working on laravel passport api
- list - Flutter FireStore 空列表
- javascript - 动态地将系列添加到 highcharts
- python - 使用 numpy 向量化循环
- android - 使用 chrome://inspect/#devices 时看不到代码流动?