我正在尝试创建一个特征,其中包括返回对某些内部数据的迭代器的函数,然后可以由不同的结构实现。一个最小的例子如下:
trait WrapperTrait {
type WrapperIterator: Iterator<Item=u32>;
fn iter(&self) -> Self::WrapperIterator;
}
struct Wrapper {
data: Vec<u32>
}
impl WrapperTrait for Wrapper {
type WrapperIterator = ...;
fn iter(&self) -> Self::WrapperIterator {
return self.data.iter().map(|&x| x);
}
}
但是,WrapperIterator
的类型相当复杂 - 从一条错误消息(通过类型不匹配创建)我发现它是:
std::iter::Map<std::slice::Iter<'_, u32>, [closure@borrow.rs:45:37: 45:43]>
有没有办法让 Rust 为 WrapperIterator
推断出正确的类型?
最佳答案
不幸的是,这在稳定的 rust 中是不可能的,但是有 a plan来介绍这个功能。如果您想尝试(目前不稳定的)功能,您可以使用 #![feature(min_type_alias_impl_trait)]
在 rust nightly 上进行尝试。您必须为特征添加一个类型参数:
#![feature(min_type_alias_impl_trait)]
trait WrapperTrait<'a> {
type WrapperIterator: Iterator<Item = u32> + 'a;
fn iter(&'a self) -> Self::WrapperIterator;
}
struct Wrapper {
data: Vec<u32>,
}
impl<'a> WrapperTrait<'a> for Wrapper {
type WrapperIterator = impl Iterator<Item = u32> + 'a;
fn iter(&'a self) -> Self::WrapperIterator {
self.data.iter().map(|&x| x)
}
}
Playground 链接:https://play.rust-lang.org/?version=nightly&mode=debug&edition=2018&gist=a9434bcd32ea9c910fd0f9e329d17bd5
要在不向特征添加生命周期参数的情况下做到这一点,还需要另一个不稳定的 Rust 特性:通用关联类型。
#![feature(min_type_alias_impl_trait)]
#![feature(generic_associated_types)]
trait WrapperTrait {
type WrapperIterator<'a>: Iterator<Item = u32>;
fn iter<'a>(&'a self) -> Self::WrapperIterator<'a>;
}
struct Wrapper {
data: Vec<u32>,
}
impl WrapperTrait for Wrapper {
type WrapperIterator<'a> = impl Iterator<Item = u32>;
fn iter<'a>(&'a self) -> Self::WrapperIterator<'a>{
self.data.iter().map(|&x| x)
}
}
Playground :https://play.rust-lang.org/?version=nightly&mode=debug&edition=2018&gist=049c875b27a0e9e472d854e6218df267
关于rust - 有没有办法让 Rust 推断关联类型的正确类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40814524/