首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RangeFull不能索引&[u8]吗?

RangeFull不能索引&[u8]吗?
EN

Stack Overflow用户
提问于 2020-09-27 20:42:16
回答 1查看 294关注 0票数 1

我正在尝试创建一个结构,它可以包含任何可以切分到[u8]的内容。

代码语言:javascript
复制
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();
}

我得到了错误

代码语言:javascript
复制
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。有没有一种方法可以说这两种特征都是可以接受的?

EN

回答 1

Stack Overflow用户

发布于 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,您的代码将变成:

代码语言:javascript
复制
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();
}

Playground example

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64088594

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档