Generics 为所属和借用实施特征

Generics 为所属和借用实施特征,generics,rust,traits,ownership,borrowing,Generics,Rust,Traits,Ownership,Borrowing,我有以下的锈迹片段: trait Foo{ fn foo(和self); } 结构FooImpl; 为FooImpl{ fn foo(&self){} } fn do_foo(foo_doer:impl foo){ foo_doer.foo() } 这条线路的工作原理是: do_foo(FooImpl{}); 但当我尝试运行此程序时: do_foo(&FooImpl{}); 我可以理解地得到错误:特性绑定&FooImpl:Foo不满足 我显然可以做到这一点: impl-Foo for&Fo

我有以下的锈迹片段:

trait Foo{
fn foo(和self);
}
结构FooImpl;
为FooImpl{
fn foo(&self){}
}
fn do_foo(foo_doer:impl foo){
foo_doer.foo()
}
这条线路的工作原理是:

do_foo(FooImpl{});
但当我尝试运行此程序时:

do_foo(&FooImpl{});
我可以理解地得到错误:
特性绑定&FooImpl:Foo不满足

我显然可以做到这一点:

impl-Foo for&FooImpl{fn-Foo(&self){}
然后它会工作,但我必须对多种类型执行此操作,并且每次都必须复制一些代码。此外,在我的情况下,我不仅可以获得借阅,而且可以获得可变借阅。这意味着我必须为
&mut FooImpl
实现它,有时我想从可变借用的不可变借用运行它,这意味着我必须为
&mut FooImpl
实现它,你明白了

我的问题是,是否有一些您可以推荐的trait impl/generic技巧可以让我为拥有的实例和借用的实例同时植入trait

或者,我可以在
do\u foo
函数端更改一些允许它接受这两种类型实例的内容吗

我已经读过了,它在我的玩具程序中起作用。但我的问题是,我试图在我的实际代码中实现的特性来自不同的板条箱,因此编译器不允许我对该特性执行
借用
,我认为这是由于孤立规则(错误:
类型参数B必须用作某些本地类型的类型参数
)。是否有一种解决方案可以绕过孤儿规则

我的问题是,是否有一些您可以推荐的trait impl/generic技巧可以让我为拥有的实例和借用的实例同时植入trait

你也许可以

有时我想从可变借用的不可变借用运行它,这意味着我必须为
&&mut FooImpl
实现它,你明白了


只需重新箭头即可获得一个
&FooImpl

定义一个宏并使用它生成您的impl?应用Shepmaster对此处另一个问题的回答:
impl-Foo for&“F,其中F:Foo{…}
将涵盖所有与
&
引用相关的基础,如果愿意,您可以对
&mut
引用执行相同的操作。
?大小的
绑定并不是严格必需的,但允许您使用引用实现来引用trait对象。另外,请阅读解释为什么需要额外的
impl
绑定。@谢谢,但我的trait在另一个板条箱中,忘了提及它,请参阅我的编辑。第二个链接也很有启发性,所以也要感谢。如果它在不同的板条箱中,则板条箱本身应提供此
impl
,或者
FooImpl
有一些特殊之处,使得对它的引用非常特殊,因为它们可以实现
Foo
,尽管通常对实现
Foo
的其他类型的引用不能实现。据我所知,没有通用的解决方法(除了使用宏,如eggyal所建议的),但可能有一种适合您的具体情况;不幸的是,这个问题没有包含足够的信息来提出建议。