我可以为我的 struct 实现Iterator个特征,并免费实现IntoIterator个特征,这要归功于一揽子实现.

struct Foo {}

impl Iterator for Foo {
    type Item = ();
    fn next(&mut self) -> Option<Self::Item> { None }
}

fn bar(foo: Foo) {
    foo.into_iter(); // implemented automatically for my struct
}

但为什么我也能这么做呢?

fn bar(foo: &mut Foo) {
    foo.into_iter(); // works; but shouldn't into_iter require ownership?
}

INTO_ITER方法的实现似乎需要值的所有权:

impl<I: Iterator> const IntoIterator for I {
    type Item = I::Item;
    type IntoIter = I;

    #[inline]
    fn into_iter(self) -> I {
        self
    }
}

当方法INTO_ITER被定义为取得所有权时,什么允许它接受可变引用?

有没有办法使下面例子中的方法move_out表现得像方法into_iter

trait A {}
trait B {
    fn move_out(self) -> Self;
}

impl<T: A> B for T {
    fn move_out(self) -> Self {
        self
    }
}

struct Foo {}
impl A for Foo {}

fn bar(foo: &mut Foo) {
    foo.move_out(); // compile error
}

推荐答案

非常简单,任何实现Iterator的类型T也实现Iterator for &mut T.和all types implementing Iterator implement IntoIterator,这允许你在第一时间拨打into_iter.

您可以通过简单地添加相同的一揽子实现Iterator来使AB的行为相同:

impl<T: A> A for &mut T {}

Playground

Rust相关问答推荐

如何容器化Linux上基于Rust的Windows应用程序的编译过程?

如何使用Match比较 struct 中的值

文档示例需要导入相关的 struct ,但仅在运行测试时.这是故意的行为吗?

如何删除Mac Tauri上的停靠图标?

如何高效地将 struct 向量中的字段收集到单独的数组中

无法将 rust 蚀向量附加到另一个向量

如何设置activx websocket actorless的消息大小限制?

std mpsc 发送者通道在闭包中使用时关闭

Rust 中的内存管理

std::vector::shrink_to_fit 如何在 Rust 中工作?

如何递归传递闭包作为参数?

如何连接 Rust 中的相邻切片

If let expression within .iter().any

预期类型参数,发现不透明类型

有没有办法隐藏类型定义?

Rust 内联 asm 中的向量寄存器:不能将 `Simd` 类型的值用于内联汇编

如何构建包含本地依赖项的 docker 镜像?

如何在 Rust 的内置函数上实现特征?

在 Rust 中组合特征的不同方法是否等效?

如何从 Rust 应用程序连接到 Docker 容器中的 SurrealDB?