首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在用nom进行语法分析时,无法推断函数` `tuple`‘上声明的类型参数’I‘的类型

在用nom进行语法分析时,无法推断函数` `tuple`‘上声明的类型参数’I‘的类型
EN

Stack Overflow用户
提问于 2020-07-14 10:09:55
回答 1查看 1.1K关注 0票数 3

我正在尝试使用nomtuple函数。文档给出了以下示例:

代码语言:javascript
复制
use nom::sequence::tuple;
use nom::character::complete::{alpha1, digit1};
let parser = tuple((alpha1, digit1, alpha1));

当我试用它时,我会得到一个编译错误:

代码语言:javascript
复制
    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

代码语言:javascript
复制
[dependencies]
nom = ">=5.0"
EN

Stack Overflow用户

回答已采纳

发布于 2020-07-15 12:12:30

类型推断需要足够的信息来实际推断类型。您可以通过从文档中复制完整的示例来提供所需的信息,包括两个assert_eq!()语句:

代码语言:javascript
复制
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能够推断出所有类型:

代码语言:javascript
复制
let _parser = tuple::<&str, _, (_, _), _>((alpha1, digit1, alpha1));

请注意,在Rust中类型推断的细节并不是语言规范的一部分,而且在Rust的未来版本中可能会发生变化。虽然Rust具有很强的向后兼容性保证,但有时在升级到较新版本时,您可能需要向代码中添加一些类型注释。

票数 5
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62892762

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档