Rust中R: AsRef<[T]>泛型约束在T为u64时为何报错?
错误产生原因
- 泛型参数和实际传参类型不匹配:你为函数
a指定的泛型R是&[u64],对应要求a内部调用时传入的第一个参数是&[R]也就是元素为u64切片的数组/切片,但你实际在a函数里调用b的时候传的是&[1,2,3],这是元素为普通整数的数组,单个整数当然没有实现AsRef<[T]trait,直接触发类型校验失败。 - 函数逻辑和泛型设计脱节:你在
a的参数中定义了回调a_fn,但函数内部根本没有使用这个传入的回调,反而硬编码调用了b,泛型参数T、R完全没有作用到内部调用逻辑上,类型推断无法关联你在c中指定的泛型参数和a内部的调用逻辑。 - 整数字面量无明确类型:你写的
1,2,3都是无明确类型的整数字面量,Rust默认会推断为i32或者标记为{integer}待推导,和你指定的T=u64也不匹配。
修复方案
如果你要实现R为&[u64]的场景,调整逻辑让泛型参数生效、传参符合类型约束即可,修改后代码如下:
pub fn a< T: Copy, R: AsRef<[T]> >( a_fn: &dyn Fn(&[R], &mut [u64]), // 把要传入回调的参数从内部硬编码改成外部传入,适配泛型 input: &[R] ) { let mut result = vec![0, 3]; // 不要硬编码调用b,用传入的回调 a_fn(input, result.as_mut_slice()); } fn b<T: Copy, R: AsRef<[T]>>(_: &[R], _: &mut [u64]) { unimplemented!(); } fn c() { // 构造符合R类型要求的输入:元素是&[u64]的切片 let input = &[&[1u64,2,3] as &[u64]]; a::<u64, &[u64]>(&b, input); }
如果一定要把输入逻辑写在a内部,也可以直接对内部硬编码的参数做类型匹配:
pub fn a< T: Copy, R: AsRef<[T]> >( a_fn: &dyn Fn(&[R], &mut [u64]), ) where R: From<&'static [u64]> // 加约束让R可以从静态u64切片转换 { let mut result = vec![0, 3]; // 构造符合R类型的输入 let input = &[R::from(&[1u64,2,3])]; a_fn(input, result.as_mut_slice()); } fn b<T: Copy, R: AsRef<[T]>>(_: &[R], _: &mut [u64]) { unimplemented!(); } fn c() { a::<u64, &[u64]>(&b); }
两种写法都可以正常编译通过,符合你要的R为u64切片、满足AsRef<[T]>约束的要求。
内容的提问来源于stack exchange,提问作者Rafaelo
相关产品推荐
相关产品推荐

