所以我有一个特征,我想传递并执行一些动态方法调度。我有一个方法需要特征作为装箱指针,但它需要调用另一个使用特征引用的方法。所以像:
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);
}
Run Code Online (Sandbox Code Playgroud)
但是,我在此代码上遇到错误
error: failed to find an implementation of trait Foo for Box Foo<no-bounds>
Run Code Online (Sandbox Code Playgroud)
编译器会根据需要自动转换Box<Foo>成&Foo。你只能说
foo_as_ref(foo);
Run Code Online (Sandbox Code Playgroud)
它会起作用。
这不一定适用于更复杂的情况。也就是说,编译器不能总是告诉你你想要那种转换。
既然已经实现了夏令时,就可以说&*foo进行转换了。
在过去,强制它的唯一方法是let-binding,如
let ref_foo: &Foo = foo;
Run Code Online (Sandbox Code Playgroud)
当然,您的用例很简单,您不需要它。
| 归档时间: |
|
| 查看次数: |
3721 次 |
| 最近记录: |