#macro #utility #tool #impl-block

无 std impl_twice

使用单个 impl 块实现两种类型的项

3 个版本

0.0.3 2020年11月10日
0.0.2 2020年11月10日
0.0.1 2020年11月10日

#255无标准库

MIT 许可证

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)
    }
}

如你所见,重复的两个方法 innerget 现在只实现了一次。

构建

像构建任何其他的 rust crate 一样构建这个,或者将其作为你项目中的依赖项添加。

贡献

如果你有任何想法,欢迎提出问题或 pull request。

无运行时依赖