参照外し

よし! 満足できる最小限のスタックを実装しました。プッシュ、ポップができ、 そして最後に自身を片付けることができます。しかし、我々が欲しい 沢山の機能があります。特に、適切な配列はあるけれども、スライスの 機能がありません。これは実際とても簡単に解決することができます。すなわち、 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)
        }
    }
}

これで、 lenfirstlast、 インデックス参照、スライス、ソート、 iteriter_mut、そして他のスライスによって提供される、あらゆる 魅力的なツールを手に入れました。やったね!

関連キーワード:  参照, スライス, mut, 実装, Vec, self, ライフタイム, slice, DerefMut, サイズ