首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >into_iter()可在迭代器上多次使用

into_iter()可在迭代器上多次使用
EN

Stack Overflow用户
提问于 2021-06-23 03:50:12
回答 1查看 107关注 0票数 1

我对rust是个新手,我在复习迭代器,如果我直接实现迭代器而不是IntoIterator,为什么我能够调用into_iter (和太多次).My理解是如果我实现了IntoIterator,我应该通过into_iter.But访问迭代器如果我能够实现迭代器,为什么我仍然需要into_iter(如果我没有给出我的猜测.My in,就会被隐式调用)

代码语言:javascript
复制
struct StrSplit<'a> {
    rest: &'a str,
    delim: &'a str,
}

impl<'a> StrSplit<'a> {
    fn new(haystack: &'a str, delim: &'a str) -> Self {
        Self {
            rest: haystack,
            delim,
        }
    }
}

impl<'a> Iterator for StrSplit<'a> {
    type Item = &'a str;
    fn next(&mut self) -> Option<Self::Item> {
        let to_return;
        if let Some(next) = self.rest.find(self.delim) {
            to_return = &self.rest[..next];
            self.rest = &self.rest[next + self.delim.len() + 1..];
            return Some(to_return);
        } else if !self.rest.is_empty() {
            to_return = self.rest;
            self.rest="";
            return Some(to_return);
        }
        return None;
    }
}

fn main() {
    let check = StrSplit::new("this was to check what was to be checked", "was");

    let iterr = check.into_iter().into_iter().into_iter();
    for part in iterr {
        println!("{}", part);
    }
}
EN

回答 1

Stack Overflow用户

发布于 2021-06-23 04:32:21

如果你是Rust的新手,这可能有点微妙,但你会经常看到标准库的特性:

您正确地注意到,into_iterIntoIterator特征的一种方法。您还注意到,您为结构实现了Iterator,但没有为IntoIterator实现。那是怎么回事呢?

检查定义在Iterator上的方法,找不到into_iter

但是现在,如果您查看IntoIterator的文档,并向下滚动到实现者列表https://doc.rust-lang.org/std/iter/trait.IntoIterator.html#implementors

您将找到以下代码片段:

代码语言:javascript
复制
impl<I> IntoIterator for I
where
    I: Iterator

这被称为全面实现:对于任何实现Iterator特征的类型T,都会自动有一个IntoIterator特征的实现!

因为您的结构实现了Iterator,所以它也实现了IntoIterator

在标准库中还有其他一些这样的例子。例如,如果为某些类型B实现From<A>,则会自动获得为类型A实现的Into<B>特征。

另一个例子是ToString

代码语言:javascript
复制
impl<T> ToString for T where
    T: Display + ?Sized,

任何实现Display特征的类型都可以免费获得ToString特征!

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68089965

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档