作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
尝试使用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/
我是一名优秀的程序员,十分优秀!