3 个版本
0.0.3 | 2020年11月10日 |
---|---|
0.0.2 | 2020年11月10日 |
0.0.1 | 2020年11月10日 |
#255 在 无标准库
13KB
66 行
impl_twice
为两种类型使用相同的实现块
使用 rust 编写,https://www.rust-lang.net.cn/
示例
在编写 rust 程序时,有时你需要两种类型,一个是不可变的,另一个是可变的。
可以使用 DST(如标准库中的切片类型)来去除这种重复,其中 &[T]
和 &mut [T]
是不可变/可变的对应类型。然而,程序员不能创建 DST,因此它们并不总是适用。
当制作两个非常相似的类型,它们只是彼此的不可变/可变对应物时,你可能在两种类型上实现相同的内容。以下是一个重复的示例;
struct WrappedSlice<'a, T>(&'a [T]);
struct WrappedSliceMut<'a, T>(&'a mut [T]);
impl<T> WrappedSlice<'_, T> {
pub fn inner(&self) -> &'_ [T] {
self.0
}
pub fn get(&self, index: usize) -> Option<&'_ T> {
self.0.get(index)
}
}
impl<T> WrappedSliceMut<'_, T> {
pub fn inner(&self) -> &'_ [T] {
self.0
}
pub fn get(&self, index: usize) -> Option<&'_ T> {
self.0.get(index)
}
pub fn get_mut(&mut self, index: usize) -> Option<&'_ mut T> {
self.0.get_mut(index)
}
}
可以通过一种方式实现相同项在两种类型上的实现。这正是这个 crate 的设计目的!这是一个等效的示例,但使用这个 crate 实现:
struct WrappedSlice<'a, T>(&'a [T]);
struct WrappedSliceMut<'a, T>(&'a mut [T]);
impl_twice! (
impl<T> WrappedSlice<'_, T>, WrappedSliceMut<'_, T> {
pub fn inner(&self) -> &'_ [T] {
self.0
}
pub fn get(&self, index: usize) -> Option<&'_ T> {
self.0.get(index)
}
}
);
impl<T> WrappedSliceMut<'_, T> {
pub fn get_mut(&mut self, index: usize) -> Option<&'_ mut T> {
self.0.get_mut(index)
}
}
如你所见,重复的两个方法 inner
和 get
现在只实现了一次。
构建
像构建任何其他的 rust crate 一样构建这个,或者将其作为你项目中的依赖项添加。
贡献
如果你有任何想法,欢迎提出问题或 pull request。