如何为Rust nom解析函数指定类型解决类型参数推断报错
解决方法
错误原因
- 首次编译报错是因为编译器无法自动推断
many0_count的错误类型参数E,需要手动显式指定。 - 第二次报错是因为你错误将
E参数指定为nom::error::ErrorKind,该类型仅为错误码枚举,本身未实现many0_count要求的ParseError<&str>trait 约束。nom 内置的通用实现了ParseErrortrait 的类型为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
相关产品推荐
相关产品推荐

