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的一些变化,但我不确定它到底会如何工作。
Cargo.toml
[dependencies]
nom = ">=5.0"发布于 2020-07-15 12:12:30
类型推断需要足够的信息来实际推断类型。您可以通过从文档中复制完整的示例来提供所需的信息,包括两个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具有很强的向后兼容性保证,但有时在升级到较新版本时,您可能需要向代码中添加一些类型注释。
https://stackoverflow.com/questions/62892762
复制相似问题