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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 17:05:07