1.0.0[−][src]Trait nom::lib::std::ops::Drop
Used to run some code when a value goes out of scope. This is sometimes called a 'destructor'.
When a value goes out of scope, it will have its drop
method called if
its type implements Drop
. Then, any fields the value contains will also
be dropped recursively.
Because of this recursive dropping, you do not need to implement this trait unless your type needs its own destructor logic.
Refer to the chapter on Drop
in The Rust Programming Language
for some more elaboration.
Examples
Implementing Drop
The drop
method is called when _x
goes out of scope, and therefore
main
prints Dropping!
.
struct HasDrop; impl Drop for HasDrop { fn drop(&mut self) { println!("Dropping!"); } } fn main() { let _x = HasDrop; }
Dropping is done recursively
When outer
goes out of scope, the drop
method will be called first for
Outer
, then for Inner
. Therefore, main
prints Dropping Outer!
and
then Dropping Inner!
.
struct Inner; struct Outer(Inner); impl Drop for Inner { fn drop(&mut self) { println!("Dropping Inner!"); } } impl Drop for Outer { fn drop(&mut self) { println!("Dropping Outer!"); } } fn main() { let _x = Outer(Inner); }
Variables are dropped in reverse order of declaration
_first
is declared first and _second
is declared second, so main
will
print Declared second!
and then Declared first!
.
struct PrintOnDrop(&'static str); impl Drop for PrintOnDrop { fn drop(&mut self) { println!("{}", self.0); } } fn main() { let _first = PrintOnDrop("Declared first!"); let _second = PrintOnDrop("Declared second!"); }
Required Methods
fn drop(&mut self)
Executes the destructor for this type.
This method is called implicitly when the value goes out of scope,
and cannot be called explicitly (this is compiler error E0040).
However, the std::mem::drop
function in the prelude can be
used to call the argument's Drop
implementation.
When this method has been called, self
has not yet been deallocated.
That only happens after the method is over.
If this wasn't the case, self
would be a dangling reference.
Panics
Given that a panic!
will call drop
as it unwinds, any panic!
in a drop
implementation will likely abort.
Implementations on Foreign Types
impl<'a, T> Drop for RwLockReadGuard<'a, T> where
T: ?Sized,
[src]
impl<'a, T> Drop for RwLockReadGuard<'a, T> where
T: ?Sized,
impl<T> Drop for RwLock<T> where
T: ?Sized,
[src]
impl<T> Drop for RwLock<T> where
T: ?Sized,
impl<'a, T> Drop for RwLockWriteGuard<'a, T> where
T: ?Sized,
[src]
impl<'a, T> Drop for RwLockWriteGuard<'a, T> where
T: ?Sized,
impl<'rx, T> Drop for Handle<'rx, T> where
T: Send,
[src]
impl<'rx, T> Drop for Handle<'rx, T> where
T: Send,
impl<'a, T> Drop for MutexGuard<'a, T> where
T: ?Sized,
[src]
impl<'a, T> Drop for MutexGuard<'a, T> where
T: ?Sized,
impl<W> Drop for BufWriter<W> where
W: Write,
[src]
impl<W> Drop for BufWriter<W> where
W: Write,
impl<T> Drop for SyncSender<T>
[src]
impl<T> Drop for SyncSender<T>
impl<T> Drop for Sender<T>
[src]
impl<T> Drop for Sender<T>
impl Drop for Select
[src]
impl Drop for Select
impl<T> Drop for Receiver<T>
[src]
impl<T> Drop for Receiver<T>
impl<T> Drop for Mutex<T> where
T: ?Sized,
[src]
impl<T> Drop for Mutex<T> where
T: ?Sized,
impl Drop for Condvar
[src]
impl Drop for Condvar
impl Drop for CString
[src]
impl Drop for CString
impl<'a, T> Drop for LocalFutureObj<'a, T>
[src]
impl<'a, T> Drop for LocalFutureObj<'a, T>
impl Drop for LocalWaker
[src]
impl Drop for LocalWaker
impl Drop for Waker
[src]
impl Drop for Waker
impl<T> Drop for Weak<T> where
T: ?Sized,
[src]
impl<T> Drop for Weak<T> where
T: ?Sized,
fn drop(&mut self)
[src]
fn drop(&mut self)
Drops the Weak
pointer.
Examples
use std::sync::{Arc, Weak}; struct Foo; impl Drop for Foo { fn drop(&mut self) { println!("dropped!"); } } let foo = Arc::new(Foo); let weak_foo = Arc::downgrade(&foo); let other_weak_foo = Weak::clone(&weak_foo); drop(weak_foo); // Doesn't print anything drop(foo); // Prints "dropped!" assert!(other_weak_foo.upgrade().is_none());
impl<T> Drop for Weak<T> where
T: ?Sized,
[src]
impl<T> Drop for Weak<T> where
T: ?Sized,
fn drop(&mut self)
[src]
fn drop(&mut self)
Drops the Weak
pointer.
Examples
use std::rc::{Rc, Weak}; struct Foo; impl Drop for Foo { fn drop(&mut self) { println!("dropped!"); } } let foo = Rc::new(Foo); let weak_foo = Rc::downgrade(&foo); let other_weak_foo = Weak::clone(&weak_foo); drop(weak_foo); // Doesn't print anything drop(foo); // Prints "dropped!" assert!(other_weak_foo.upgrade().is_none());
impl<T> Drop for Arc<T> where
T: ?Sized,
[src]
impl<T> Drop for Arc<T> where
T: ?Sized,
fn drop(&mut self)
[src]
fn drop(&mut self)
Drops the Arc
.
This will decrement the strong reference count. If the strong reference
count reaches zero then the only other references (if any) are
[Weak
], so we drop
the inner value.
Examples
use std::sync::Arc; struct Foo; impl Drop for Foo { fn drop(&mut self) { println!("dropped!"); } } let foo = Arc::new(Foo); let foo2 = Arc::clone(&foo); drop(foo); // Doesn't print anything drop(foo2); // Prints "dropped!"
impl<T> Drop for Rc<T> where
T: ?Sized,
[src]
impl<T> Drop for Rc<T> where
T: ?Sized,
fn drop(&mut self)
[src]
fn drop(&mut self)
Drops the Rc
.
This will decrement the strong reference count. If the strong reference
count reaches zero then the only other references (if any) are
[Weak
], so we drop
the inner value.
Examples
use std::rc::Rc; struct Foo; impl Drop for Foo { fn drop(&mut self) { println!("dropped!"); } } let foo = Rc::new(Foo); let foo2 = Rc::clone(&foo); drop(foo); // Doesn't print anything drop(foo2); // Prints "dropped!"
Implementors
impl<'a> Drop for nom::lib::std::string::Drain<'a>
[src]
impl<'a> Drop for nom::lib::std::string::Drain<'a>
impl<'a, I> Drop for Splice<'a, I> where
I: Iterator,
[src]
impl<'a, I> Drop for Splice<'a, I> where
I: Iterator,
impl<'a, T> Drop for nom::lib::std::collections::vec_deque::Drain<'a, T> where
T: 'a,
[src]
impl<'a, T> Drop for nom::lib::std::collections::vec_deque::Drain<'a, T> where
T: 'a,
impl<'a, T> Drop for nom::lib::std::vec::Drain<'a, T>
[src]
impl<'a, T> Drop for nom::lib::std::vec::Drain<'a, T>
impl<'a, T> Drop for PeekMut<'a, T> where
T: Ord,
[src]
impl<'a, T> Drop for PeekMut<'a, T> where
T: Ord,
impl<'a, T, F> Drop for nom::lib::std::collections::linked_list::DrainFilter<'a, T, F> where
F: FnMut(&mut T) -> bool,
[src]
impl<'a, T, F> Drop for nom::lib::std::collections::linked_list::DrainFilter<'a, T, F> where
F: FnMut(&mut T) -> bool,
impl<'a, T, F> Drop for nom::lib::std::vec::DrainFilter<'a, T, F> where
F: FnMut(&mut T) -> bool,
[src]
impl<'a, T, F> Drop for nom::lib::std::vec::DrainFilter<'a, T, F> where
F: FnMut(&mut T) -> bool,
impl<K, V> Drop for nom::lib::std::collections::btree_map::IntoIter<K, V>
[src]
impl<K, V> Drop for nom::lib::std::collections::btree_map::IntoIter<K, V>
impl<K, V> Drop for BTreeMap<K, V>
[src]
impl<K, V> Drop for BTreeMap<K, V>
impl<T> Drop for VecDeque<T>
[src]
impl<T> Drop for VecDeque<T>
impl<T> Drop for nom::lib::std::vec::IntoIter<T>
[src]
impl<T> Drop for nom::lib::std::vec::IntoIter<T>
impl<T> Drop for LinkedList<T>
[src]
impl<T> Drop for LinkedList<T>
impl<T> Drop for Box<T> where
T: ?Sized,
[src]
impl<T> Drop for Box<T> where
T: ?Sized,
impl<T> Drop for Vec<T>
[src]
impl<T> Drop for Vec<T>