Deref

好了!我们已经实现了一个基本像样的栈。我们可以 push 和 pop,我们还可以自己 drop。然而,我们还需要一大堆的功能。特别是, 尽管我们有了一个合适的数组,但还没有切片的功能。这其实很容易解决:我们可以实现Deref<Target=[T]>。这将神奇地使我们的 Vec 在各种条件下强制成为一个切片,并且表现得像一个切片。

我们只需要slice::from_raw_parts。它将为我们正确处理空切片。之后当我们设置了零大小的类型支持,它也会对这些类型进行正确的处理。

  1. use std::ops::Deref;
  2. impl<T> Deref for Vec<T> {
  3. type Target = [T];
  4. fn deref(&self) -> &[T] {
  5. unsafe {
  6. std::slice::from_raw_parts(self.ptr.as_ptr(), self.len)
  7. }
  8. }
  9. }

还有 DerefMut:

  1. use std::ops::DerefMut;
  2. impl<T> DerefMut for Vec<T> {
  3. fn deref_mut(&mut self) -> &mut [T] {
  4. unsafe {
  5. std::slice::from_raw_parts_mut(self.ptr.as_ptr(), self.len)
  6. }
  7. }
  8. }

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