You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为Rust nom解析函数指定类型解决类型参数推断报错

解决方法

错误原因

  1. 首次编译报错是因为编译器无法自动推断many0_count的错误类型参数E,需要手动显式指定。
  2. 第二次报错是因为你错误将E参数指定为nom::error::ErrorKind,该类型仅为错误码枚举,本身未实现many0_count要求的ParseError<&str> trait 约束。nom 内置的通用实现了ParseError trait 的类型为nom::error::Error<I>,其中I对应输入类型,你这里输入是&str,所以错误类型应为nom::error::Error<&str>。

正确代码

你不需要手动填写所有泛型参数,仅需指定错误类型即可,其余参数编译器会自动推断:

use nom::error::Error;

fn get_indent_level(input: &str) -> usize {
    let (_, result) = many0_count::<_, _, Error<&str>, _>(
        alt((tag("L_ "), tag("|  "), tag("   ")))
    )(input).unwrap_or_default();
    result
}

你也可以通过标注解析结果的类型来避免手动指定泛型:

use nom::IResult;
use nom::error::Error;

fn get_indent_level(input: &str) -> usize {
    let parse_res: IResult<&str, usize, Error<&str>> = many0_count(
        alt((tag("L_ "), tag("|  "), tag("   ")))
    )(input);
    parse_res.map(|(_, count)| count).unwrap_or_default()
}

内容的提问来源于stack exchange,提问作者user130268

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 07:24:02