【问题标题】:nom & borrowed value does not live long enough error标称 & 借来的价值不存在足够长的错误
【发布时间】:2021-01-23 19:33:14
【问题描述】:

尝试使用 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

【问题讨论】:

    标签: rust parser-combinators nom


    【解决方案1】:

    parse_multiline() 你返回IResult&lt;&amp;str, Vec&lt;(&amp;str, &amp;str)&gt;&gt;。这意味着如果您的parse_multiline() 失败,那么它会返回nom::Err&lt;nom::error::Error&lt;&amp;str&gt;&gt;,其中引用了i/&amp;raw

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


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

    // nom = "6.1"
    use nom::error::Error;
    
    pub fn parse(raw: String) -> anyhow::Result<()> {
        let (_, lines) = parse_multiline(&raw)
            .map_err(|err| err.map(|err| Error::new(err.input.to_string(), err.code)))?;
    
        // ...
    }
    

    【讨论】:

    • 啊!我从没想过有引用的错误——我过分关注成功的结果。谢谢!
    • @neezer 公平地说,仅考虑到编译错误,确实有点令人困惑:)
    猜你喜欢
    • 1970-01-01
    • 2020-07-23
    • 1970-01-01
    • 1970-01-01
    • 2019-11-29
    • 1970-01-01
    • 2016-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多