Указание времени жизни в `named_args` nom (ожидаемое конкретное время жизни, найденное ограничение) - PullRequest
0 голосов
/ 14 мая 2019

Я новичок в 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 парсера, но я полностью потерян относительно того, как / какие из них выбрать.

...