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)
}
}
}
现在我们有了 len
、first
、last
、索引、切片、排序、iter
、iter_mut
以及切片提供的所有其他各种花里胡哨的东西。太棒了!