Rust中仅用宏为assert_eq!和vec!提供类型注解可行吗?
Rust中通过宏为assert_eq!的vec!提供类型提示解决E0282错误
在Rust编写测试代码时,使用assert_eq!和vec!宏会遇到error[E0282]: type annotations needed类型推断错误。示例中assert_eq!(chop(&vec![]), vec![])无法通过编译,而assert_eq!(chop(&vec![]), Vec::<&[u32]>::new())可正常运行,请问是否仅通过宏就能为编译器提供类型提示?
错误信息
error[E0282]: type annotations needed --> src/lib.rs:6:9 | 6 | assert_eq!(chop(&vec![]), vec![]); // error[E0282]: type annotations needed | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ cannot infer type
示例代码
#[cfg(test)] mod tests { #[test] fn test_chop() { assert_eq!(chop(&vec![]), Vec::<&[u32]>::new()); // 编译正常 assert_eq!(chop(&vec![]), vec![]); // 触发E0282错误 assert_eq!(chop(&vec![1, 1]), vec![[1, 1]]); assert_eq!(chop(&vec![1, 2, 3, 4]), vec![[1, 2], [3, 4]]); } fn chop(rolls: &Vec<u32>) -> Vec<&[u32]> { rolls.chunks(2).collect() } }
解决方案:仅通过宏提供类型提示
当然可以,不需要显式调用Vec::new(),有几种简洁的方式:
1. 给vec!宏直接添加类型标注
利用Rust的turbofish语法,直接在vec!后指定类型,让编译器明确空向量的类型:
assert_eq!(chop(&vec![]), vec![]::<&[u32]>);
2. 给左侧的vec!参数添加强类型提示
左边的&vec![]也可以通过类型标注给编译器提供线索,进而反推右侧vec!的类型:
assert_eq!(chop(&vec![] as &Vec<u32>), vec![]);
3. 借助类型推断的上下文(非空场景)
如果vec!里有元素,编译器会自动推断类型,但空向量没有这个线索,所以必须手动标注。比如你的测试中vec![[1,1]]能正常编译,就是因为元素的类型让编译器确定了Vec<&[u32]>。
原因说明
空vec!本身没有任何类型信息,而左侧的chop(&vec![])中,&vec![]也是空的,编译器无法通过它确定chop的输入类型,进而没法推断返回类型,最终导致整个断言两边的类型都无法推导。只要给任意一边提供明确的类型提示,就能让编译器完成类型推断,而直接给vec!宏加类型标注是最直观的方案。
内容的提问来源于stack exchange,提问作者michael.kebe
相关产品推荐
相关产品推荐

