9.5 Deref
为 Vec 实现 Deref
1分钟内可阅读完
译文 · 基于 The Rustonomicon
Deref
好!我们有了像样的最小栈实现。能 push、能 pop、能自我清理。然而还缺大量合理想要的功能。尤其我们有了真正的数组,却没有 slice 功能。这很好解决:实现 Deref<Target=[T]>。这会神奇地让 Vec 在各种情况下强制转换为 slice 并表现得像 slice。
我们只需 slice::from_raw_parts。它会正确处理空 slice。之后设置零大小类型支持时,对它们也会 Just Work。
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)
}
}
}
现在我们有 slice 提供的 len、first、last、索引、切片、排序、iter、iter_mut 等各种功能。妙极了!