Для вывода типа требуется достаточно информации, чтобы фактически вывести тип. Вы можете предоставить требуемую информацию, скопировав полный пример из документации, включая два оператора 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 имеет достаточно надежные гарантии обратной совместимости, иногда вам может потребоваться добавить некоторые аннотации типов в свой код при обновлении до более новой версии.