为什么Box<[u8]>内的[u8]未满足AsRef<[u8]> + AsMut<[u8]>约束?
Rust代码编译错误解决方案
问题1:未实现自定义MemAs<T> trait
你定义的MemAs<T>属于自定义trait,Rust不会自动为满足父trait约束的类型实现该trait,所以哪怕[u8]已经实现了AsRef<[u8]>和AsMut<[u8]>,也不满足MemAs<u8>的约束,这是第一个报错的根本原因。
你需要补充自动实现规则:
// 为所有满足父trait约束的类型自动实现MemAs<T> impl<T, U: AsMut<[T]> + AsRef<[T]> + ?Sized> MemAs<T> for U {}
问题2:trait默认带Sized约束,和切片类型属性冲突
Rust的所有trait默认存在隐式的Sized约束,要求实现者是编译期固定大小的类型,但[u8]是动态大小类型(DST),不满足Sized约束,这是第二个报错的原因。
你需要在trait定义中放宽Sized约束:
// 新增?Sized表示允许实现者是动态大小类型 pub trait MemAs<T>: AsMut<[T]> + AsRef<[T]> + ?Sized {}
问题3:返回值类型声明与预期不符
你提到期望返回Box<[u8]>类型,但你当前代码的返回值声明为Box<dyn MemAs<u8>> trait对象。如果你不需要多态能力,直接修改返回值类型声明即可,不需要做上述两处修改:
fn allocate(size: usize) -> Box<[u8]> { vec![0; size].into_boxed_slice() }
如果你确实需要返回dyn MemAs<u8> trait对象,修改后的完整可编译代码如下:
pub trait MemAs<T>: AsMut<[T]> + AsRef<[T]> + ?Sized {} impl<T, U: AsMut<[T]> + AsRef<[T]> + ?Sized> MemAs<T> for U {} fn allocate(size: usize) -> Box<dyn MemAs<u8>> { vec![0; size].into_boxed_slice() }
内容的提问来源于stack exchange,提问作者Poperton
相关产品推荐
相关产品推荐

