为什么Vec <&str>在这里缺少生命周期说明符?

时间:2019-07-30 07:32:01

标签: rust lifetime

此代码编译:

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>会导致这种编译错误?

1 个答案:

答案 0 :(得分:0)

编译器被告知您正在借用一个值,但是没有使用该值多久。它应该是静态的吗?还有吗?

我想您正在尝试执行以下操作。

struct StrDisplayable<'a>(Vec<&'a str>);

这样,您就明确地告诉编译器,这些字符串的生存时间至少与该结构一样长,至少如此。

您还需要延长特质的实现期限,如果使用Rust 2018,则可以匿名添加。