可变地迭代 &[1,2,3,4,5,6,7,8,9] 以接收 `&mut [1,4,7]` 然后 `&mut [2,5,8]` 然后 `&mut[ 3,6,9]`

Raf*_*elo 6 rust

我试图迭代分成块的切片,并返回一个包含每个块的第 n 个元素的元组。

例子:

&[1,2,3,4,5,6,7,8,9]

我想将其分成大小为 3 的块,然后迭代结果,返回这些元组,每个 next() 调用返回一个元组:

&mut[1,4,7], &mut[2,5,8], &mut[3,6,9]

我知道对于一般的东西,不可能返回可变的东西,这显然是不相交的,并且没有不安全的代码,我们可以拥有ChunksMuthttps://doc.rust-lang.org/std/slice/struct.ChunksMut .html)迭代器,所以也许有办法!。例如,我可以有 3 个ChunksMut,然后编译器知道从它们返回的元素是不相交的。

这是我对非可变的尝试:

https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=cfa7ca0bacbe6f1535050cd7dd5c537c

PS:我想避免每次迭代时使用 Vec 或任何分配

use*_*342 4

所以我总是返回对其内部切片的引用

Iterator特征不支持这一点,因为它的契约允许调用者提取多个值并使用所有它们。例如,Iterator您的实现允许但不支持以下内容:

// take two values out of the iterator
let a = it.next().unwrap();
let b = it.next().unwrap();
Run Code Online (Sandbox Code Playgroud)

您需要的是一个“借出迭代器”(也称为“流式迭代器”),请参阅此 crate一旦GAT 稳定,编写贷款迭代器将变得容易得多,但它们仍然不受std::iter::Iterator.

使用该标准,Iterator您可以通过使用ArrayVec或等效替换来避免分配Vec,如@Stargateur建议的那样。