为什么借阅检查器认为内容的寿命不足?

问题描述

我对Rust还是很陌生,并且具有以下功能

编辑:据我所知,这是该函数的较新版本

pub fn new_from_file_path(path: &str) -> Parser {
    let path_buf: PathBuf = PathBuf::from(path);
    let absolute_path: PathBuf = std::fs::canonicalize(path_buf).unwrap();
    let data: String = std::fs::read_to_string(absolute_path).unwrap();
    let clone = data.clone();

    let s_slice: &str = &clone[..];
    return Parser::new_from_string_data(s_slice);
}

这是new_from_string_data()函数的实现

pub fn new_from_string_data(data: &str) -> Parser {
    let parser = Parser::new(data.chars());
    return parser;
}

这是解析器的结构定义:

pub struct Parser<'a> {
    tokenizer: Tokenizer<'a>,}

这是我收到的错误消息的屏幕截图

A screenshot of the error message

任何帮助将不胜感激,如果需要更多信息,也请告知我。

解决方法

new_from_string_data函数返回一个Parser,其生存期与其输入参数data相同。

对于new_from_file_pathdatas_slice,它是函数clone所拥有的字符串new_from_file_path的一部分。因此,返回的Parser将引用clone,而该new_from_file_path从函数.navigationBarTitle("",displayMode: .inline) 返回时会被破坏

,

str::chars()返回一个迭代器结构,该结构需要显式的生存期,因为它(可能是我自己尚未阅读完整的结构定义)引用传递给chars()pub struct Chars<'a> { /* fields omitted */ })的数据,就像您的Parser结构一样,您正在语句new_from_file_path的{​​{1}}内部生成引用的变量。

我建议仅向函数标头添加一个生命周期批注,以便其内容如下:

let clone = data.clone();

这不会使函数调用复杂化,并告诉编译器返回的pub fn new_from_file_path<'a>(path: &'a str) -> Parser<'a> {...}结构及其引用应与传递给函数的数据具有相同的生存期。