rust - 使用 nom 解析时,无法推断函数“元组”上声明的类型参数“I”的类型
问题描述
我正在尝试使用nom
'stuple
功能。该文档提供了以下示例:
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
,但我不确定它是如何工作的。
货运.toml
[dependencies]
nom = ">=5.0"
解决方案
类型推断需要足够的信息来实际推断类型。您可以通过复制文档中的完整示例来提供所需的信息,包括两个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 具有相当强大的向后兼容性保证,但在升级到较新版本时,有时可能需要在代码中添加一些类型注释。
推荐阅读
- angular - Angular:反应形式是不可变的是什么意思?
- go - golang中参数中的动态结构
- sql - SQL - 按最新日期排序查询,然后按 ID
- python - 刮痧。按内容查找标签
- python - 安装了 anaconda 但找不到 anaconda 导航器
- windows - 如何在批处理文件中接受多组参数?
- android - 如何在 GlobalScope 一之后将 Coroutines viewModelScope 作业排入队列
- html - 使用matplotlib,如何使图例不透明,但最终背景透明?
- ios - 模式演示风格 iOS 13 上的横向应用程序
- node.js - 在侦听 MQTT 消息的 pm2-daemonized nodejs 脚本中,如何还侦听特定的击键?