Now that we’ve discussed traits, let’s talk about a particular trait provided
by the Rust standard library, Drop
`Drop`. The Drop
`Drop` trait provides a way
to run some code when a value goes out of scope. For example:
struct HasDrop; impl Drop for HasDrop { fn drop(&mut self) { println!("Dropping!"); } } fn main() { let x = HasDrop; // do stuff } // x goes out of scope here
When x
`xgoes out of scope at the end of
` goes out of scope at the end of main()
`main(), the code for
`, the code for Drop
`Dropwill run.
` will
run. Drop
`Drophas one method, which is also called
` has one method, which is also called drop()
`drop(). It takes a mutable reference to
`. It takes a mutable
reference to self
`self`.
That’s it! The mechanics of Drop
`Drop` are very simple, but there are some
subtleties. For example, values are dropped in the opposite order they are
declared. Here’s another example:
struct Firework { strength: i32, } impl Drop for Firework { fn drop(&mut self) { println!("BOOM times {}!!!", self.strength); } } fn main() { let firecracker = Firework { strength: 1 }; let tnt = Firework { strength: 100 }; }
This will output:
BOOM times 100!!!
BOOM times 1!!!
The TNT goes off before the firecracker does, because it was declared afterwards. Last in, first out.
So what is Drop
`Dropgood for? Generally,
` good for? Generally, Drop
`Dropis used to clean up any resources associated with a
` is used to clean up any resources
associated with a struct
`struct. For example, the [
`. For example, the Arc<T>
`ArcDrop
`Drop` is called, it will decrement the reference
count, and if the total number of references is zero, will clean up the
underlying value.