pub trait DrainWhileable<T> {
// Required method
fn drain_while<P>(&mut self, pred: P) -> DrainWhile<'_, T> ⓘ
where P: Fn(&T) -> bool;
}Required Methods§
Sourcefn drain_while<P>(&mut self, pred: P) -> DrainWhile<'_, T> ⓘ
fn drain_while<P>(&mut self, pred: P) -> DrainWhile<'_, T> ⓘ
Take the elements of a vector, left-to-right, stopping at the first non-matching element.
The returned DrainWhile iterates over the longest prefex in which all elements satisfy
pred; when the iterator is dropped, the prefix is removed from vec.
let mut orig: Vec<usize> = vec![0,1,2,3,4,5];
let none: Vec<usize> = orig.drain_while(|_| false).collect();
let some: Vec<usize> = orig.drain_while(|x| *x < 3).collect();
let rest: Vec<usize> = orig.drain_while(|_| true).collect();
assert_eq!(none, vec![]);
assert_eq!(some, vec![0,1,2]);
assert_eq!(rest, vec![3,4,5]);
assert_eq!(orig, vec![]);The behaviour of drain_while() differs from drain().take_while() in the final state of
the original vector, as illustrated here:
let mut v1 = vec![1,2,3,4,5];
let mut v2 = vec![1,2,3,4,5];
v1.drain(..).take_while(|x| *x < 3);
v2.drain_while(|x| *x < 3);
assert_eq!(v1, vec![]);
assert_eq!(v2, vec![3,4,5]);The same caveats which apply to drain also apply to drain_while:
- The element range is removed even if the iterator is only partially consumed or not consumed at all.
- It is unspecified how many elements are removed from the vector, if the
DrainWhilevalue is leaked.
The current implementation is fairly naive, but I believe there’s scope for speeding it up substantially.
Dyn Compatibility§
This trait is not dyn compatible.
In older versions of Rust, dyn compatibility was called "object safety".