gpt4 book ai didi

rust - 如何从 trait 方法返回 HashSet 键的迭代器?

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

这个问题在这里已经有了答案:





What is the correct way to return an Iterator (or any other trait)?

(2 个回答)



Is it possible to use `impl Trait` as a function's return type in a trait definition?

(4 个回答)



"Expected type parameter" error in the constructor of a generic struct

(1 个回答)


2年前关闭。




一个结构有一组我想允许客户迭代的项目。这是一个尝试:

use std::collections::HashSet;
use std::hash::Hash;

pub struct Foo<T: Eq + Hash> {
items: HashSet<T>,
}

impl<'a, T: 'a + Eq + Hash> Foo<T> {
pub fn new() -> Self {
Foo {
items: HashSet::new(),
}
}

pub fn iterate<I>(&self) -> I
where
I: IntoIterator<Item = &'a T>,
{
self.items.iter()
}
}

这无法编译,给出错误:

error[E0308]: mismatched types
--> src/lib.rs:19:9
|
15 | pub fn iterate<I>(&self) -> I
| - expected `I` because of return type
...
19 | self.items.iter()
| ^^^^^^^^^^^^^^^^^ expected type parameter, found struct `std::collections::hash_set::Iter`
|
= note: expected type `I`
found type `std::collections::hash_set::Iter<'_, T>`
= help: type parameters must be constrained to match other types
= note: for more information, visit https://doc.rust-lang.org/book/ch10-02-traits.html#traits-as-parameters

来自 HashSet::iter 的返回值方法看起来像 Iterator例如,在 for 循环中。似乎在我的 iterate 中可能会出现某种类型的强制。方法,但显然编译器有其他想法。

如何指定返回类型 Iterator在函数中,同时从 HashSet 返回返回值迭代器?

换句话说,我想将迭代委托(delegate)给 HashSet .我想避免实现一个自定义迭代器来做到这一点,但如果这是唯一的方法,那么有兴趣看看它是如何完成的。我已经能够通过返回 Box<dyn Iterator> 来完成这项工作。 ,但如果可以仅使用 this answer 中所述的特征边界,我也想避免这种方法。 .

还有一个要求:当 iterate 时,该方法必须有效。方法在特征上声明。这似乎排除了以下方法:

pub trait FooTrait {
fn iterate(&self) -> impl Iterator<Item=&T>;
}

最佳答案

你想要impl Iterator :

impl<'a, T: 'a + Eq + Hash> Foo<T> {
// ...

pub fn iterate(&'a self) -> impl Iterator<Item = &'a T> {
self.items.iter()
}
}

Rust 书有 this section覆盖它。它在 RFC 1522 中定义和完善。 , RFC 1951 , 和 RFC 2071 .还没有全部完成,还有 this tracking issue .

关于rust - 如何从 trait 方法返回 HashSet 键的迭代器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59376227/

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