如何解决自动导出Arc的特征实现
我有一个特征和一个实现它的struct
。包装在struct
中的Arc
可以调用trait的方法,但是Arc
本身不能实现它:
use std::sync::Arc;
trait Foo{
fn bar(&self);
}
struct A;
impl Foo for A{
fn bar(&self){ }
}
fn test<A: Foo>(arc_a: Arc<A>){
let foo_obj: & dyn Foo = &arc_a; //the trait bound `std::sync::Arc<A>: Foo` is not satisfied
}
以下代码可以正常工作:
use std::sync::Arc;
trait Foo{
fn bar(&self);
}
struct A;
impl Foo for A{
fn bar(&self){ }
}
impl<A> Foo for Arc<A> //Manually implemented
where
A: Foo
{
fn bar(&self){ self.bar() }
}
fn test<A: Foo>(arc_a: Arc<A>){
let foo_obj: & dyn Foo = &arc_a;
}
解决方法
您必须手动实现它们。尽管您手动完成ParticipantRef
的工作似乎微不足道,但重要的部分是GameTable
中的“隐藏”,其中从Foo for Arc<A>
到self.bar()
进行了自动反引用。请记住,您的实现self: &Arc<A>
实际上可能完全不同;在现实世界中,我们通常只需要“ deref impl”。
在第一个示例中
&A
如果您执行Foo for Arc<A>
,则它将编译,因为fn test<A: Foo>(arc_a: Arc<A>){
let foo_obj: &dyn Foo = &arc_a;
}
从= &*arc_a
退回到*arc_a
,而Arc<A>
是A
。
在第二个示例中,您提供了手动实施&*arc_a
&dyn Foo
在这里,上面已明确说明的deref现在隐含在for Arc<A>
中。这样可以避免手动取消引用,但是impl可能会完全不同。例如:
impl<A> Foo for Arc<A> where A: Foo {
fn bar(&self){ self.bar() }
}
由于self.bar()
使用impl Foo for A{
fn bar(&self){ println!("This is fine") }
}
impl<A> Foo for Arc<A>
where
A: Foo
{
fn bar(&self) { panic!() }
}
fn test<A: Foo>(arc_a: Arc<A>){
let foo_obj: & dyn Foo = &arc_a;
foo_obj.bar()
}
fn main() {
test(Arc::new(A))
}
,因此上述程序会出现紧急情况。如果将foo_obj
中的行更改为impl for Arc<A>
,将使用test
,程序将打印“ This is fine”。
如果对于通用智能指针仅需要= &*arc_a
的简单显示,则可以通过宏进行操作:
impl for A
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。