Метод take_while
Метод take_while создаёт новый итератор,
который извлекает элементы из исходного итератора
до тех пор, пока предикат возвращает true.
Как только предикат вернёт false, итератор
завершается и больше не возвращает элементы,
даже если последующие элементы удовлетворяют условию.
Параметром метод принимает замыкание-предикат,
которое получает ссылку на очередной элемент
и возвращает bool.
Метод является ленивым: элементы извлекаются
по мере необходимости при вызове next.
Синтаксис
iter.take_while(predicate)
Пример
Давайте возьмём элементы из вектора до тех пор,
пока они меньше 4:
fn main()
{
let vec = vec![1, 2, 3, 4, 5, 1, 2];
let res: Vec<i32> = vec.iter()
.take_while(|&&x| x < 4)
.cloned()
.collect();
println!("{:?}", res);
}
Результат выполнения кода:
[1, 2, 3]
Пример
Обратите внимание, что после первого элемента, не удовлетворяющего условию, итератор полностью останавливается. Давайте убедимся в этом на примере:
fn main()
{
let vec = vec![1, 2, 3, 10, 4, 5];
let res: Vec<i32> = vec.iter()
.take_while(|&&x| x < 5)
.cloned()
.collect();
println!("{:?}", res);
}
Результат выполнения кода:
[1, 2, 3]
Несмотря на то, что элементы 4 и 5
удовлетворяют условию, они не попали в результат,
потому что итератор остановился на элементе 10.
Пример
Давайте применим take_while к итератору
символов строки и выведем результат:
fn main()
{
let s = "abcde";
let res: String = s.chars()
.take_while(|&c| c != 'c')
.collect();
println!("{}", res);
}
Результат выполнения кода:
"ab"
Смотрите также
-
метод
take,
который берёт первые n элементов итератора -
метод
skip_while,
который пропускает элементы, пока предикат возвращает true -
метод
filter,
который оставляет только элементы, удовлетворяющие предикату -
метод
map_while,
который преобразует элементы, пока предикат возвращает true