Метод chunks_exact
Метод chunks_exact возвращает итератор,
который разбивает срез на части (чанки)
фиксированной длины. В отличие от метода
chunks, последний неполный чанк
отбрасывается, а не возвращается как остаток.
Параметром метод принимает число chunk_size -
размер каждого чанка. Если размер равен нулю,
программа паникует.
Метод возвращает итератор, элементами которого
являются срезы длиной chunk_size.
Если длина исходного среза не кратна размеру
чанка, оставшиеся элементы в итерацию не попадают.
Синтаксис
slice.chunks_exact(chunk_size)
Пример
Давайте разобьём вектор vec![1, 2, 3, 4, 5, 6, 7, 8]
на чанки по 3 элемента:
fn main()
{
let vec = vec![1, 2, 3, 4, 5, 6, 7, 8];
let res: Vec<&[i32]> = vec.chunks_exact(3).collect();
println!("{:?}", res);
}
Результат выполнения кода:
[[1, 2, 3], [4, 5, 6]]
Обратите внимание: элементы 7 и 8
не попали в результат, так как для них не хватило
полного чанка.
Пример
Давайте разобьём вектор vec![1, 2, 3, 4, 5, 6]
на чанки по 2 элемента - длина кратна размеру,
поэтому все элементы попадут в результат:
fn main()
{
let vec = vec![1, 2, 3, 4, 5, 6];
let res: Vec<&[i32]> = vec.chunks_exact(2).collect();
println!("{:?}", res);
}
Результат выполнения кода:
[[1, 2], [3, 4], [5, 6]]
Пример
Давайте получим остаток, который не вошёл ни в один
полный чанк, с помощью метода remainder:
fn main()
{
let vec = vec![1, 2, 3, 4, 5, 6, 7, 8];
let mut iter = vec.chunks_exact(3);
let res: Vec<&[i32]> = iter.by_ref().collect();
println!("{:?}", res);
println!("{:?}", iter.remainder());
}
Результат выполнения кода:
[[1, 2, 3], [4, 5, 6]]
[7, 8]
Пример
Давайте разобьём срез строки "abcde"
на чанки по 2 символа:
fn main()
{
let slice = &"abcde"[..];
let res: Vec<&str> = slice.as_bytes().chunks_exact(2)
.map(|chunk| std::str::from_utf8(chunk).unwrap())
.collect();
println!("{:?}", res);
}
Результат выполнения кода:
["ab", "cd"]