传递盒装特征作为参考

时间:2014-05-19 16:42:59

标签: rust

所以我有一个特性,我想传递并做一些动态方法调度。我有一个方法需要特征作为盒装指针,但它需要调用另一个使用特征引用的方法。如下所示:

trait Foo {
    fn do_something(&self);
}

struct Bar;

impl Foo for Bar {
    fn do_something(&self) {}
}

fn foo_as_box(foo : Box<Foo>) {
    foo_as_ref(&foo);
}

fn foo_as_ref(foo : &Foo) {
    foo.do_something();
}

fn main() {
    let boxed_foo = box Bar as Box<Foo>;
    foo_as_box(boxed_foo);
} 

但是,我在这段代码上收到错误

error: failed to find an implementation of trait Foo for Box Foo<no-bounds>

1 个答案:

答案 0 :(得分:4)

编译器会根据需要自动将Box<Foo>转换为&Foo。你可以说

foo_as_ref(foo);

它会起作用。

不幸的是,这并不一定适用于更复杂的情况。也就是说,编译器总是不能说你想要那个转换。现在,强制它的唯一方法是使用let - 绑定,如

let ref_foo: &Foo = foo;

将来,DST实施后,您可以说&*foo进行转换。

当然,您的用例非常简单,您根本不需要这样做。