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