gpt4 book ai didi

rust - 如何调用 Iter::chain 以及返回类型是什么?

转载 作者:行者123 更新时间:2023-12-03 11:29:12 27 4
gpt4 key购买 nike

我正在尝试创建一个迭代器,它将向向量的开头添加一个元素

struct World {
player: Object,
npcs: Vec<Object>,
}

impl World {
pub fn all_objects(&mut self) -> ???
}
我知道我需要使用 chain函数,但我不确定如何,或者返回类型是什么
也许有人可以向我解释如何使用它?

最佳答案

迭代器的确切类型可能很复杂。确定它们的一个快速方法是尝试故意返回错误的类型,然后看看编译器怎么说:

struct Object;

struct World {
player: Object,
npcs: Vec<Object>,
}

impl World {
pub fn all_objects(&mut self) -> () {
std::iter::once(&self.player).chain(self.npcs.iter())
}
}
(Permalink to the playground)
这给出:
error[E0308]: mismatched types
--> src/lib.rs:10:9
|
9 | pub fn all_objects(&mut self) -> () {
| -- expected `()` because of return type
10 | std::iter::once(&self.player).chain(self.npcs.iter())
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^- help: try adding a semicolon: `;`
| |
| expected `()`, found struct `std::iter::Chain`
|
= note: expected unit type `()`
found struct `std::iter::Chain<std::iter::Once<&Object>, std::slice::Iter<'_, Object>>`
事实上,如果你替换它,它会编译:
struct Object;

struct World {
player: Object,
npcs: Vec<Object>,
}

impl World {
pub fn all_objects(
&mut self,
) -> std::iter::Chain<std::iter::Once<&Object>, std::slice::Iter<'_, Object>> {
std::iter::once(&self.player).chain(self.npcs.iter())
}
}
但是确切的类型通常与迭代器无关,因此您可以简单地指定您的函数返回某种迭代器:
struct Object;

struct World {
player: Object,
npcs: Vec<Object>,
}

impl World {
pub fn all_objects(&mut self) -> impl Iterator<Item = &Object> {
std::iter::once(&self.player).chain(self.npcs.iter())
}
}
(Permalink to the playground)
这也更加灵活,因为它可以让您在不影响函数用户的情况下更改实现。

关于rust - 如何调用 Iter::chain 以及返回类型是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66076379/

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