| # Traits |
| |
| Of course `trait`s can also be generic. Here we define one which reimplements |
| the `Drop` `trait` as a generic method to `drop` itself and an input. |
| |
| ```rust,editable |
| // Non-copyable types. |
| struct Empty; |
| struct Null; |
| |
| // A trait generic over `T`. |
| trait DoubleDrop<T> { |
| // Define a method on the caller type which takes an |
| // additional single parameter `T` and does nothing with it. |
| fn double_drop(self, _: T); |
| } |
| |
| // Implement `DoubleDrop<T>` for any generic parameter `T` and |
| // caller `U`. |
| impl<T, U> DoubleDrop<T> for U { |
| // This method takes ownership of both passed arguments, |
| // deallocating both. |
| fn double_drop(self, _: T) {} |
| } |
| |
| fn main() { |
| let empty = Empty; |
| let null = Null; |
| |
| // Deallocate `empty` and `null`. |
| empty.double_drop(null); |
| |
| //empty; |
| //null; |
| // ^ TODO: Try uncommenting these lines. |
| } |
| ``` |
| |
| ### See also: |
| |
| [`Drop`][Drop], [`struct`][structs], and [`trait`][traits] |
| |
| [Drop]: https://doc.rust-lang.org/std/ops/trait.Drop.html |
| [structs]: ../custom_types/structs.md |
| [traits]: ../trait.md |