rust - 有没有办法让 Rust 推断关联类型的正确类型?

标签 rust

我正在尝试创建一个特征,其中包括返回对某些内部数据的迭代器的函数,然后可以由不同的结构实现。一个最小的例子如下:

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/

相关文章:

rust - 有没有办法将多个派生别名作为一个派生?

rust - 我如何让结构的字段成为 `Iterator` 超过 `T` 元素?

rust - 无需克隆即可获得 HashMap.get() 结果的所有权

rust - 我如何在一个结构中使用 PhantomData 和原始指针,这样该结构的生命周期不会超过引用的其他结构的生命周期?

rust - 如果 strong_count 为 1 且 weak_count 为 0,包含 `Send` 的 `Rc` 结构是否安全?

python - 在解释器或编译器的上下文中,单元格是什么?

vector - 如何从向量中解压(解构)元素?

使用 clone_from_slice() 而不是 copy_from_slice() 的性能损失?

regex - 使用正则表达式结果的最佳模式是什么?

windows - 如何防止 Rust std::process:Command 将 .exe 相对路径插入参数?