首页 > 解决方案 > 为什么 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::Displaya Vec<&str>,这通常需要Vec这样包装,但是它只适用于Vec<u8>,为什么替换Vec<u8>Vec<&str>导致这样的编译错误?

标签: rustlifetime

解决方案


编译器被告知您正在借用一个值,但不知道它会存在多长时间。它应该是静态的吗?还有什么?

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

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

这样,您就明确地告诉编译器字符串将至少与结构一样长,不少于。

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


推荐阅读