解引用

好了!我们已经实现了一个像样的最小栈。我们可以压入、弹出,并且可以清理自己。但是,我们还需要很多合理的功能。特别是,我们有一个合适的数组,但没有切片功能。这实际上很容易解决:我们可以实现 Deref<Target=[T]>。这将神奇地使我们的 Vec 在各种情况下强制转换为切片并像切片一样工作。

我们只需要 slice::from_raw_parts。它将为我们正确处理空切片。稍后,一旦我们设置了零尺寸类型支持,它也将对它们起作用。

use std::ops::Deref;

impl<T> Deref for Vec<T> {
    type Target = [T];
    fn deref(&self) -> &[T] {
        unsafe {
            std::slice::from_raw_parts(self.ptr.as_ptr(), self.len)
        }
    }
}

我们也实现 DerefMut 吧

use std::ops::DerefMut;

impl<T> DerefMut for Vec<T> {
    fn deref_mut(&mut self) -> &mut [T] {
        unsafe {
            std::slice::from_raw_parts_mut(self.ptr.as_ptr(), self.len)
        }
    }
}

现在我们有了 lenfirstlast、索引、切片、排序、iteriter_mut 以及切片提供的各种其他功能。太棒了!