gpt4 book ai didi

rust - 标称值和借入值的生命周期不足错误

转载 作者:行者123 更新时间:2023-12-03 11:36:16 25 4
gpt4 key购买 nike

尝试使用nom并遍历我的结果,但是我不知道为什么这个借来的值(value)生命周期不长。对于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/&raw
因此,在parse()中,parse_multiline(raw)?进一步传播了该错误,这将返回对raw的引用,该引用的生存时间不够长。

如果要保留fn parse(raw: String),则可以使用 Result::map_err() ,然后使用 nom::Err::map() ,以在出错时将&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)))?;

// ...
}

关于rust - 标称值和借入值的生命周期不足错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65863551/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com