Generics 当其中一个关联类型无法命名时,如何实现特征?

Generics 当其中一个关联类型无法命名时,如何实现特征?,generics,rust,traits,associated-types,Generics,Rust,Traits,Associated Types,我有一个返回impl Trait的函数,因此我无法访问具体的返回类型。我需要使用该函数的返回值作为trait中的关联类型。我该怎么做 以下是一个简化的示例: fn f()->impl迭代器{ std::iter::empty() } 结构; S的impl-into迭代器{ 类型项=u8; 输入IntoIter=();//我可以在这里写什么? fn进入iter(self)->self::进入iter{ f() } } 甚至可以这样做(不必对迭代器进行装箱)?不幸的是,您不能。至少现在还没有 有一

我有一个返回
impl Trait
的函数,因此我无法访问具体的返回类型。我需要使用该函数的返回值作为trait中的关联类型。我该怎么做

以下是一个简化的示例:

fn f()->impl迭代器{
std::iter::empty()
}
结构;
S的impl-into迭代器{
类型项=u8;
输入IntoIter=();//我可以在这里写什么?
fn进入iter(self)->self::进入iter{
f()
}
}

甚至可以这样做(不必对迭代器进行装箱)?

不幸的是,您不能。至少现在还没有

有一个RFC,(),它允许您在模块级别声明公共类型名,其类型定义是从它在模块中的使用方式推断出来的。模块的用户可以通过其公共名称引用此类型,并且可以将其用作关联类型

很难猜测新功能何时会稳定下来,同时也没有太多好的选择。除了可能只因用例的具体情况而起作用的事情外,一般的解决方法是使用trait对象:

impl IntoIterator for S {
    type Item = u8;
    type IntoIter = Box<dyn Iterator<Item = u8>>;

    fn into_iter(self) -> Self::IntoIter {
        Box::new(f())
    }
}
S的impl into迭代器{ 类型项=u8; 输入iter=Box; fn进入iter(self)->self::进入iter{ Box::new(f()) } } 如果可以使用夜间功能,您可以在RFC稳定前帮助测试:

#![feature(existential_type)]

impl IntoIterator for S {
    type Item = u8;
    existential type IntoIter: Iterator<Item = u8>;

    fn into_iter(self) -> Self::IntoIter {
        f()
    }
}
#![特征(存在型)]
S的impl-into迭代器{
类型项=u8;
存在类型IntoIter:迭代器;
fn进入iter(self)->self::进入iter{
f()
}
}

一个措辞得体的问题加上一个恰当的MCVE,真是太好了!谢谢你的明确回答。那么,我要用一个盒子。感觉被rust出卖了,他答应我零成本抽象:p