最佳答案
我有 Foo
特质
pub trait Foo {
fn do_something(&self) -> f64;
}
以及引用该特征的结构
pub struct Bar {
foo: Foo,
}
尝试编译我得到
error: reference to trait `Foo` where a type is expected; try `Box<Foo>` or `&Foo`
将结构更改为
struct Bar {
foo: &Foo,
}
告诉我 error: missing lifetime specifier
将定义更改为
struct Bar {
foo: Box<Foo>,
}
编译,耶!
然而,当我想要一个函数返回 bar
上的 foo
时,比如:
impl Bar {
fn get_foo(&self) -> Foo {
self.foo
}
}
很明显,bar.foo
是 Box<Foo>
,所以我得到了 error: reference to trait `Foo` where a type is expected; try `Box<Foo>` or `&Foo`
将签名更改为
impl Bar {
fn get_foo(&self) -> Box<Foo> {
let this = *self;
this.foo
}
}
但是现在我让 error: cannot move out of dereference of `&`-pointer
尝试去引用 self
。
换到
impl Bar {
fn get_foo(self) -> Box<Foo> {
self.foo
}
}
一切都好。
那么..。
&
在 bar
结构中不工作? 我假设我必须打拳击
因为 struct 有一个集合内存布局,所以我们必须说它是一个指针
(因为我们不知道它会有多大) ,但是为什么
编译器建议一些不能编译的东西?get_foo()
中解引用 self
-我看到的所有示例都使用借来的 self
语法?&
并仅仅使用 self
意味着什么?学习锈是迷人的,但记忆安全是既迷人又令人生畏!
编译的完整代码:
trait Foo {
fn do_something(&self) -> f64;
}
struct Bar {
foo: Box<Foo>,
}
impl Bar {
fn get_foo(self) -> Box<Foo> {
let foo = self.foo;
foo.do_something();
foo
}
}
fn main() {}