Rollup merge of #25317 - steveklabnik:trpl_drop, r=alexcrichton
r? @alexcrichton
This commit is contained in:
commit
fe8a4e3dbf
@ -1,3 +1,67 @@
|
||||
% `Drop`
|
||||
% Drop
|
||||
|
||||
Coming soon!
|
||||
Now that we’ve discussed traits, let’s talk about a particular trait provided
|
||||
by the Rust standard library, [`Drop`][drop]. The `Drop` trait provides a way
|
||||
to run some code when a value goes out of scope. For example:
|
||||
|
||||
[drop]: ../std/ops/trait.Drop.html
|
||||
|
||||
```rust
|
||||
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` goes out of scope at the end of `main()`, the code for `Drop` will
|
||||
run. `Drop` has one method, which is also called `drop()`. It takes a mutable
|
||||
reference to `self`.
|
||||
|
||||
That’s it! The mechanics of `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:
|
||||
|
||||
```rust
|
||||
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:
|
||||
|
||||
```text
|
||||
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` good for? Generally, `Drop` is used to clean up any resources
|
||||
associated with a `struct`. For example, the [`Arc<T>` type][arc] is a
|
||||
reference-counted type. When `Drop` is called, it will decrement the reference
|
||||
count, and if the total number of references is zero, will clean up the
|
||||
underlying value.
|
||||
|
||||
[arc]: ../std/sync/struct.Arc.html
|
||||
|
Loading…
x
Reference in New Issue
Block a user