微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

标称值和借用值的寿命不够长错误

如何解决标称值和借用值的寿命不够长错误

尝试使用 nom 并迭代我的结果,但我无法弄清楚为什么这个借来的值没有足够长的时间。仍然是 Rust 的新手,并且已经头撞了几个小时。非常感谢帮助!

use anyhow;
use nom::{
    bytes::complete::{tag,take},character::complete::newline,combinator::rest,multi::separated_list1,sequence::separated_pair,IResult,};

pub fn parse(raw: String) -> anyhow::Result<()> {
    let (_,lines) = parse_multiline(&raw)?;

    for line in lines.iter() {
        let (label,value) = line;

        println!("label: {},value: {}",label,value);
    }

    Ok(())
}

fn parse_multiline(i: &str) -> IResult<&str,Vec<(&str,&str)>> {
    separated_list1(
        newline,separated_pair(
            take(14usize),tag(" : "),rest,),)(i)
}

错误

error[E0597]: `raw` does not live long enough
  --> src/parser/person.rs:12:38
   |
12 |     let (_,lines) = parse_multiline(&raw)?;
   |                      ----------------^^^^-
   |                      |               |
   |                      |               borrowed value does not live long enough
   |                      argument requires that `raw` is borrowed for `'static`
...
21 | }
   | - `raw` dropped here while still borrowed

解决方法

parse_multiline() 中返回 IResult<&str,Vec<(&str,&str)>>。这意味着,如果您的 parse_multiline() 失败,则它返回 nom::Err<nom::error::Error<&str>>,其中引用了 i/{{1} }.

因此在 &raw 中,parse() 会进一步传播该错误,这将返回对 parse_multiline(raw)? 的引用,而该引用的存在时间不够长。


如果您想保留 raw,那么您可以使用 Result::map_err() 然后使用 nom::Err::map(),以在出错时将 fn parse(raw: String) 转换为拥有的 &str .

String

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。