Deref

好了!我们已经实现了一个不错的最小堆栈。我们可以压入,可以弹出,并且可以在之后清理自己。然而,我们仍然需要大量合理的功能。特别是,我们有一个正确的数组,但没有切片功能。这实际上很容易解决:我们可以实现 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 以及切片提供的所有其他各种花里胡哨的东西。太棒了!