我正在尝试创建一个结构,它可以包含任何可以切分到[u8]的内容。
use std::ops::{Index, RangeFull};
struct Wrapper<DataT>
where
DataT: ?Sized + Index<RangeFull, Output = [u8]>,
{
data: DataT,
}
impl<DataT> Wrapper<DataT>
where
DataT: ?Sized + Index<RangeFull, Output = [u8]>,
{
fn subwrapper(&self) -> Wrapper<Vec<u8>> {
let mut buffer = Vec::<u8>::new();
buffer.extend_from_slice(&self.data[..]);
Wrapper {
data: buffer,
}
}
}
fn main() {
let data : [u8; 3] = [1, 2, 3];
let w = Wrapper {data: &data[..]};
let sub = w.subwrapper();
}我得到了错误
error[E0277]: the type `&[u8]` cannot be indexed by `std::ops::RangeFull`
--> src/main.rs:24:13
|
3 | / struct Wrapper<DataT>
4 | | where
5 | | DataT: ?Sized + Index<RangeFull, Output = [u8]>, {
6 | | data: DataT,
7 | | }
| |_____- required by `Wrapper`
...
24 | let w = Wrapper {data: &data[..]};
| ^^^^^^^ `&[u8]` cannot be indexed by `std::ops::RangeFull`
|
= help: the trait `std::ops::Index<std::ops::RangeFull>` is not implemented for `&[u8]`我关注了Array cannot be indexed by RangeFull?,但它似乎并没有解决问题。这是因为&[u8]是一个切片吗?当我尝试使用SliceIndex特征时,它似乎不适用于Vec。有没有一种方法可以说这两种特征都是可以接受的?
发布于 2020-09-27 21:33:35
这里的问题是,尽管片[u8]实现了Index<RangeFull>,但对片&[u8]的引用却没有。并且它是您试图存储在Wrapper中的引用,因此DataT被推断为&[u8],因此不满足特征界限DataT: Index<FullRange>。
如果你的目标是涵盖“任何可以切分到[u8]的东西”,那么你应该使用其他的特性。像AsRef<[u8]>这样的特征在这里可能更好,因为它表明“对此类型的引用可以转换为切片[u8]的引用”,这可能是“[u8]的切片”更合适的定义。(像Deref<Target = [u8]>这样的其他性状在这里也可能是合适的替代品。)
使用AsRef,您的代码将变成:
struct Wrapper<DataT>
where
DataT: AsRef<[u8]>, // <-- new trait bound
{
data: DataT,
}
impl<DataT> Wrapper<DataT>
where
DataT: AsRef<[u8]>, // <-- new trait bound
{
fn subwrapper(&self) -> Wrapper<Vec<u8>> {
let buffer = self.data.as_ref() // <-- use `.as_ref()` to get `&[u8]`
.to_vec(); // <-- more efficient way to get `Vec<u8>`
// from `&[u8]`
Wrapper { data: buffer }
}
}
fn main() {
let data: [u8; 3] = [1, 2, 3];
let w = Wrapper { data: &data }; // <-- no need to use `[..]` here, as
// `[u8; N]` implements `AsRef<[u8]>`
let sub = w.subwrapper();
}https://stackoverflow.com/questions/64088594
复制相似问题