此代码编译:
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
实现Vec<&str>
,通常需要像this一样包装Vec
,但是它仅适用于{{1 }},为什么将Vec<u8>
替换为Vec<u8>
会导致这种编译错误?
答案 0 :(得分:0)
编译器被告知您正在借用一个值,但是没有使用该值多久。它应该是静态的吗?还有吗?
我想您正在尝试执行以下操作。
struct StrDisplayable<'a>(Vec<&'a str>);
这样,您就明确地告诉编译器,这些字符串的生存时间至少与该结构一样长,至少如此。
您还需要延长特质的实现期限,如果使用Rust 2018,则可以匿名添加。