如何使用 Trait 实现迭代器

Dar*_*eth 4 iterator traits rust

我有一个名为 Library 的结构,它有一个字符串向量(标题)。我为此实现了一个迭代器。这是我的代码。

#[derive(Debug, Clone)]
struct Library {
    books: Vec<String>
}

impl Iterator for Library {
    fn next(&mut self) -> Option<Self::Item> {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,我尝试使用特征来实现迭代器,如下所示:

fn foo(x: Vec<u32>) -> impl Iterator<Item=u32> {
    //Unsure if correct method
    fn next() -> Option<...> {
       x.into_iter()....

    }
}
Run Code Online (Sandbox Code Playgroud)

但我不确定在这种情况下如何进行。我是否只需再次定义 next() 方法?根据其他资源,情况似乎并非如此。这是为什么?迭代器(正在返回)不应该有 next() 方法吗?

以这种方式实现迭代器的一般方法是什么?

cdh*_*wie 7

您不会直接在 上实现该特征Library。该库不是迭代器,但它是可以由迭代器迭代的东西。

相反,只需声明一个返回迭代器的方法,您就可以直接从向量返回迭代器。不需要自定义迭代器实现。例如:

impl Library {
    fn iter(&self) -> impl Iterator<Item=&String> {
        self.books.iter()
    }
}
Run Code Online (Sandbox Code Playgroud)

into_iter()对于第二种情况,您可以使用特征提供的将向量转换为迭代器IntoIterator

fn foo(x: Vec<u32>) -> impl Iterator<Item=u32> {
    x.into_iter()
}
Run Code Online (Sandbox Code Playgroud)