解引用
好了!我们已经实现了一个像样的最小栈。我们可以压入、弹出,并且可以清理自己。但是,我们还需要很多合理的功能。特别是,我们有一个合适的数组,但没有切片功能。这实际上很容易解决:我们可以实现 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
以及切片提供的各种其他功能。太棒了!