Я новичок в Rust, пишу синтаксический анализатор nom, который может анализировать строки, разделенные двоеточиями KEY: VALUE
s. Я сделал базовый парсер kv
с named_args
, который может анализировать пару ключ-значение:
named_args!(kv<'a>(key: &'a str)<&'a str, &'a str>,
do_parse!(
tag_s!(key) >>
tag_s!(":") >>
space0 >>
value: rest >>
(value)
)
);
Я положил время жизни там, чтобы понравиться компилятору.
Я сделал из него два парсера:
named!(name<&str,&str>,
call!(kv, "NAME")
);
named!(get_dimension<&str, i64>,
map_res!(call!(kv, "DIMENSION"), str::parse::<i64>)
);
Чтобы проверить это, я писал общую обертку, которая вызывает одну из этих функций со строкой KEY: {YOUR_VALUE}
и ожидает YOUR_VALUE
back:
fn test_kv<G: Display + Debug + PartialEq>(
kvfunc: fn(&str) -> Result<(&str, G), Err<&str>>,
key: &str,
value: G,
) {
assert_eq!(kvfunc(&format!("{}: {}", key, value)), Ok(("", value)));
}
Это прекрасно работает:
#[test]
fn test_dimension() {
test_kv(get_dimension, "DIMENSION", 8)
}
Но не с парсером name
:
#[test]
fn test_name() {
test_kv(name, "NAME", "some_name")
}
Компилятор выдаёт мне:
71 | test_kv(name, "NAME", "some_name")
| ^^^^ expected concrete lifetime, found bound lifetime parameter
|
= note: expected type `for<'r> fn(&'r str) -> std::result::Result<(&'r str, _), nom::Err<&'r str>>`
found type `for<'r> fn(&'r str) -> std::result::Result<(&'r str, &'r str), nom::Err<&'r str>> {name}`
Это меня смущает. Result<&str, &str>
не подходит Result<&str, _>
?
Поскольку он работает с версией map_res
, я предполагаю, что map_res
возвращает другое значение, возможно, с другим временем жизни.
Я думаю, что мне, возможно, придется изменить определения времени жизни моего kv
парсера, но я полностью потерян относительно того, как / какие из них выбрать.