在外部类型上实现内部类型的特征

时间:2021-04-18 07:12:33

标签: struct rust traits

使用结构:

    struct U85 (
        [u8; 5]
    );

我收到错误:

error[E0608]: cannot index into a value of type `&U85`
   --> /home/fadedbee/test.rs:11:40
    |
11  |                     s.serialize_bytes(&self[..])
    |

而当我使用简单类型 [u8; 5] 时,一切都很好。

  • [u8; 5] 的什么特征导致索引错误?
  • 如何为 U85 实施它?

1 个答案:

答案 0 :(得分:2)

x[y] 语法是通过 IndexIndexMut 特征实现的。切片索引的一个问题是 xx..y....yx.. 都是不同的类型。你可以选择你想要支持的东西,但如果你只想做切片可以做的事情,你可以像这样实现它:

use std::ops::Index;
use std::slice::SliceIndex;

struct U85([u8; 5]);

impl<I> Index<I> for U85 where I: SliceIndex<[u8]> {
    type Output = I::Output;
    fn index(&self, index: I) -> &I::Output {
        &self.0[index]
    }
}

如果您发现自己为包装类型实现了很多特征,您可以考虑使用 derive_more 板条箱,这将允许您派生出遵循内部类型的特征(如 Index)。

use derive_more::Index;

#[derive(Index)]
struct U85([u8; 5]);