我正在尝试使用可克隆迭代器对象定义一个结构。到目前为止,我已经达到:
pub struct UseClonableIterator2<'a,T:'a> {
it: &'a (Iterator<Item=T> + Clone)
}
Run Code Online (Sandbox Code Playgroud)
它无法编译,因为Clone不是“内置特征”:
x.rs:2:33: 2:38 error: only the builtin traits can be used as closure or object bounds [E0225]
x.rs:2 it: &'a (Iterator<Item=T> + Clone)
^~~~~
x.rs:2:33: 2:38 help: run `rustc --explain E0225` to see a detailed explanation
Run Code Online (Sandbox Code Playgroud)
一种选择可能是为迭代器添加另一个类型参数,但这会使定义复杂化,我宁愿避免它。
您需要动态调度吗?如果没有,您应该使用通用参数而不是特征对象——它不一定会使定义复杂化。例如尝试这个:
pub struct UseClonableIterator<I: Iterator + Clone> {
it: I
}
Run Code Online (Sandbox Code Playgroud)
Iterator您可以在此处保存实现您的类型的对象Clone。如果你只是想引用它,这当然也是可能的:
pub struct UseClonableIterator2<'a, I: Iterator + Clone + 'a> {
it: &'a I
}
Run Code Online (Sandbox Code Playgroud)
请注意,在这两个示例中,我们都使用静态调度和单态化。这通常会带来更好的性能。
然而,这并不总是可能的——有时需要使用特征对象进行动态调度(就像您尝试实现它一样)。在这种情况下,你只能通过重构代码来解决问题,因为 Rust 还不允许具有多个特征的特征对象。
| 归档时间: |
|
| 查看次数: |
593 次 |
| 最近记录: |