我对rust是个新手,我在复习迭代器,如果我直接实现迭代器而不是IntoIterator,为什么我能够调用into_iter (和太多次).My理解是如果我实现了IntoIterator,我应该通过into_iter.But访问迭代器如果我能够实现迭代器,为什么我仍然需要into_iter(如果我没有给出我的猜测.My in,就会被隐式调用)
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);
}
}发布于 2021-06-23 04:32:21
如果你是Rust的新手,这可能有点微妙,但你会经常看到标准库的特性:
您正确地注意到,into_iter是IntoIterator特征的一种方法。您还注意到,您为结构实现了Iterator,但没有为IntoIterator实现。那是怎么回事呢?
检查定义在Iterator上的方法,找不到into_iter。
但是现在,如果您查看IntoIterator的文档,并向下滚动到实现者列表https://doc.rust-lang.org/std/iter/trait.IntoIterator.html#implementors
您将找到以下代码片段:
impl<I> IntoIterator for I
where
I: Iterator这被称为全面实现:对于任何实现Iterator特征的类型T,都会自动有一个IntoIterator特征的实现!
因为您的结构实现了Iterator,所以它也实现了IntoIterator。
在标准库中还有其他一些这样的例子。例如,如果为某些类型B实现From<A>,则会自动获得为类型A实现的Into<B>特征。
另一个例子是ToString
impl<T> ToString for T where
T: Display + ?Sized,任何实现Display特征的类型都可以免费获得ToString特征!
https://stackoverflow.com/questions/68089965
复制相似问题