请考虑以下代码:
type ThingIter = dyn Iterator<Item = u64>;
trait Foo {
type ThingIter: Iterator<Item = u64>;
}
enum Bar<T: Foo> {
A(T::ThingIter),
B(ThingIter),
}
使用Rust-1.68.2进行编译时,enum arm A
编译得很好(即,如果我注释掉B
,它就会编译),但enum arm B
不能--我得到一个错误,表明ThingIter
没有在编译时可以知道的大小.
为什么会有这种不同呢?T::ThingIter
的大小在编译时也是未知的(它可以是任意大小容器的迭代器).此外,除了将其放入Box
或引用之外,我还可以做些什么来使外部type
的行为类似于内部type
(即,我可以将其放入枚举中而不会出现问题)?