Nom: невозможно определить тип для параметра типа - PullRequest
1 голос
/ 14 июля 2020

Я пытаюсь использовать функцию nom tuple. В документации представлен следующий пример:

use nom::sequence::tuple;
use nom::character::complete::{alpha1, digit1};
let parser = tuple((alpha1, digit1, alpha1));

Когда я пробую его, я получаю ошибку компиляции:

    error[E0283]: type annotations needed
   --> src/main.rs:20:18
    |
20  |     let parser = tuple((alpha1, digit1, alpha1));
    |         ------   ^^^^^ cannot infer type for type parameter `I` declared on the function `tuple`
    |         |
    |         consider giving `parser` a type
    | 

Если бы я хотел добавить тип к переменной, что бы это будет? Я знаю, что это должен быть какой-то вариант FnMut, но я не уверен, как именно он будет работать.

car go .toml

[dependencies]
nom = ">=5.0"

1 Ответ

1 голос
/ 15 июля 2020

Для вывода типа требуется достаточно информации, чтобы фактически вывести тип. Вы можете предоставить требуемую информацию, скопировав полный пример из документации, включая два оператора assert_eq!():

use nom::sequence::tuple;
use nom::character::complete::{alpha1, digit1};
let mut parser = tuple((alpha1, digit1, alpha1));

assert_eq!(parser("abc123def"), Ok(("", ("abc", "123", "def"))));
assert_eq!(parser("123def"), Err(Err::Error(("123def", ErrorKind::Alpha))));

Дополнительные вызовы информируют компилятор об аргументе и типе возвращаемого значения функции, возвращаемой функцией tuple(), который, в свою очередь, предоставляет компилятору достаточно информации для вывода всех параметров типа вызова tuple().

В качестве альтернативы вы можете явно передать параметры типа функции tuple(). Вот минимальный объем информации, который вам нужно предоставить, чтобы Rust мог вывести все типы:

let _parser = tuple::<&str, _, (_, _), _>((alpha1, digit1, alpha1));

Обратите внимание, что детали того, как выведение типов работает в Rust, не являются частью спецификации языка, и может измениться в будущих версиях Rust. Несмотря на то, что Rust имеет достаточно надежные гарантии обратной совместимости, иногда вам может потребоваться добавить некоторые аннотации типов в свой код при обновлении до более новой версии.

...