gpt4 book ai didi

rust - 如何在 Rust 中实现包装向量上的迭代器特征?

转载 作者:行者123 更新时间:2023-12-05 01:54:47 29 4
gpt4 key购买 nike

有这样的代码

#[derive(Debug)]
struct BinaryVec {
vec: Vec<u8>,
}

impl BinaryVec {
fn empty() -> BinaryVec {
BinaryVec { vec: Vec::new() }
}

fn push(&mut self, bit: u8) {
self.vec.push(bit);
}
}

我希望能够在不公开的情况下迭代结构的向量。例如,这样调用它:

let bin_vec = BinaryVec::empty();
bin_vec.push(1);
bin_vec.push(0);
bin_vec.push(1);
for el in bin_vec.iter() {
// do something with 1,0,1 elements
}

但我看到 Iterator 特性只需要 next 方法,该方法采用结构中保存的 iter 状态。

有没有什么方法可以直接将 vec iter 传递给 Rust 中的更高级别的结构,而无需向结构中添加新的状态相关字段?

最佳答案

Vec<T>本身不实现 Iterator任何一个。但是,它实现了 IntoIterator三种方式:

  • impl<T> IntoIterator for Vec<T> : 你可以写 for item in vec , 和每个 item将采取 T按值(value)。这会消耗向量。
  • impl<T> IntoIterator for &'_ [T] (其中 &Vec<T> 取消引用 &[T] ):你可以写 for item in &vec , 和每个 item将采取 &T .
  • impl<T> IntoIterator for &'_ mut [T] (其中 &mut Vec<T> 取消引用 &mut [T] ):你可以写 for item in &mut vec , 和每个 item将采取 &mut T .

您可能还想为您的包装器实现这些:

impl IntoIterator for BinaryVec {
type Item = u8;
type IntoIter = <Vec<u8> as IntoIterator>::IntoIter; // so that you don't have to write std::vec::IntoIter, which nobody remembers anyway

fn into_iter(self) -> Self::IntoIter {
self.vec.into_iter()
}
}

// We deref to slice so that we can reuse the slice impls
impl Deref for BinaryVec {
type Output = [u8];

fn deref(&self) -> &[u8] {
&self.vec[..]
}
}
impl DerefMut for BinaryVec {
type Output = [u8];

fn deref_mut(&mut self) -> &mut [u8] {
&mut self.vec[..]
}
}

注意实现 IntoIterator对于 &mut [T]不是微不足道的,所以最好重用切片中的实现。

关于rust - 如何在 Rust 中实现包装向量上的迭代器特征?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70547514/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com