トレイト
もちろんトレイトもジェネリクスを活用することができます。ここではDropトレイトをジェネリックメソッドとして再実装し、自身と引数として受け取った値の両方をdropするようなメソッドにします。
// コピー不可な型
// 訳注: `clone()`メソッドを用いないかぎり、値のコピーではなくムーブが起きる型
struct Empty;
struct Null;
// ジェネリック型 `T`に対するトレイト
trait DoubleDrop<T> {
// `self`に加えてもう一つジェネリック型を受け取り、
// 何もしないメソッドのシグネチャを定義。
fn double_drop(self, _: T);
}
// `U`を`self`として、`T`をもう一つの引数として受け取る`DoubleDrop<T>`
// を実装する。`U`,`T`はいずれもジェネリック型。
impl<T, U> DoubleDrop<T> for U {
// このメソッドは2つの引数の所有権を取り、メモリ上から開放します。
fn double_drop(self, _: T) {}
}
fn main() {
let empty = Empty;
let null = Null;
// `empty`と`null`を開放。
empty.double_drop(null);
//empty;
//null;
// ^ TODO: これらの行をアンコメントしてみましょう。
}