Rust 如何在该特性的实现者之上为迭代器实现该特性

Rust 如何在该特性的实现者之上为迭代器实现该特性,rust,Rust,假设我有一个特性,Intersectable,它是为各种几何原语实现的。我希望在这些原语的列表上为迭代器实现可相交的 我有代码(): 使用标准::借用::借用; 结构射线{} 性状可交叉{ fn相交(self、ray:&ray)->bool; } 结构圆{} 圆的impl可相交{ fn相交(自、光线和光线)->bool{ 真的 } } 圆的impl可相交(&C){ fn相交(自、光线和光线)->bool{ 真的 } } 恳求{ fn相交(自身、光线:&ray)->bool{ 为obj在自己{ 如

假设我有一个特性,
Intersectable
,它是为各种几何原语实现的。我希望在这些原语的列表上为迭代器实现
可相交的

我有代码():

使用标准::借用::借用;
结构射线{}
性状可交叉{
fn相交(self、ray:&ray)->bool;
}
结构圆{}
圆的impl可相交{
fn相交(自、光线和光线)->bool{
真的
}
}
圆的impl可相交(&C){
fn相交(自、光线和光线)->bool{
真的
}
}
恳求{
fn相交(自身、光线:&ray)->bool{
为obj在自己{
如果obj.intersect(光线){//此处发生错误
返回true;
}
}
返回false;
}
}
fn main(){
让对象:[框;2]=[
框::新(圆圈{}),
框::新(圆圈{}),
];
设ray=ray{};
//我希望在迭代器上调用intersect,如下所示:
println!(“交集:{}”,objects.iter().map(|b | b.borrow()).intersect(&ray));
}
这将产生以下错误:

error[E0161]: cannot move a value of type dyn Intersectable: the size of dyn Intersectable cannot be statically determined
  --> src/main.rs:24:16
   |
24 |             if obj.intersect(ray) {
   |                ^^^

error[E0507]: cannot move out of `*obj` which is behind a shared reference
  --> src/main.rs:24:16
   |
24 |             if obj.intersect(ray) {
   |                ^^^ move occurs because `*obj` has type `dyn Intersectable`, which does not implement the `Copy` trait
为了解决这个问题,我尝试将对
intersect
的错误调用替换为
::intersect(obj,ray)
,并添加以下实现():


impl可相交,用于&dyn可相交{
fn相交(自身、光线:&ray)->bool{
(*self.intersect(ray)//现在这里发生错误
}
}
我在新代码中得到了相同的错误。还有一次尝试产生了
错误[E0119]:trait的冲突实现,因为我试图在引用类型上实现它



那么,是否可以为
迭代器
实现
可相交

为什么您的
相交
方法使用
可相交
(即取
self
,而不是
self
)?这对你的用例来说是必要的吗?这太难了,为什么要让生活变得复杂呢@Cerberus I最初确实让它使用
&self
,但改变了这一点,这样它就可以使用
迭代器,而不必使用
复制
。没有理由不能对原语采取<代码>和“自我/代码>”。最终,我将返回距离光线原点最近的交点,但我仍然可以使用
fold
。真正的问题是,我希望能够将迭代器作为
可相交的
类型传递。