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

Why is Vec<&str> missing lifetime specifier here?

此代码编译:

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

我想做的是为 Vec<&str> 实现 fmt::Display,这通常需要像 一样包装 Vec,但它只适用于 Vec<u8>,为什么把Vec<u8>代入Vec<&str>会导致这样的编译错误?

编译器被告知您正在借用一个值,但不知道它的有效期。它应该是静态的吗?还有别的吗?

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

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

通过这种方式,您可以明确告诉编译器字符串至少与结构一样长,不会更短。

您还需要在特征的实现中添加生命周期,如果使用 Rust 2018 则可以匿名。