为什么该场景下Rust trait中的关联类型不允许这样使用?
错误原因
你的写法不符合Rust关联类型的约束规则:
- 声明关联类型
Iter时指定了它要实现Iteratortrait,但没有在声明阶段完成Iterator的关联类型Item的绑定,反而在返回值位置试图给已声明的关联类型Self::Iter加泛型参数约束,这是语法不允许的。 Iterator是带关联类型的trait,关联类型的绑定需要在约束父trait时同步指定。
修正后的代码
trait Envs { type Item; // 声明Iter关联类型时直接绑定Iterator的Item为当前trait的Item type Iter: Iterator<Item = Self::Item>; // 直接返回Iter关联类型即可,不需要额外加约束 fn get_envs(&self) -> Self::Iter; }
补充说明
如果你的实现需要支持多种迭代器元素类型,也可以将Item改为trait的泛型参数,但对于返回固定迭代器类型的场景,当前关联类型的写法更符合使用习惯,调用侧不需要手动指定泛型参数。
内容的提问来源于stack exchange,提问作者Kendrick johnson
相关产品推荐
相关产品推荐

