参照外し
よし! 満足できる最小限のスタックを実装しました。プッシュ、ポップができ、
そして最後に自身を片付けることができます。しかし、我々が欲しい
沢山の機能があります。特に、適切な配列はあるけれども、スライスの
機能がありません。これは実際とても簡単に解決することができます。すなわち、
Deref<Target=[T]>
を実装すればよいのです。これによって、 Vec に
あらゆる状況において、スライスに型強制したり、スライスのように振る舞わせる
ことができるようになります。
必要なのは slice::from_raw_parts
です。これによって、正しく空の
スライスを扱えます。サイズが 0 の型をサポートしたあとは、
これらも同様に扱えるようになります。
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, 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, self.len)
}
}
}
これで、 len
、 first
、 last
、 インデックス参照、スライス、ソート、
iter
、 iter_mut
、そして他のスライスによって提供される、あらゆる
魅力的なツールを手に入れました。やったね!