我有个特质 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>,
}
编译-是的!
但是,当我希望函数返回时foo
,bar
类似:
impl Bar {
fn get_foo(&self) -> Foo {
self.foo
}
}
好吧,显然bar.foo
是a 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
结构中不起作用?我假设我必须装箱,因为结构体具有设置的内存布局,所以我们不得不说它是一个指向特征的指针(因为我们不知道它的大小),但是为什么编译器会建议一些不会编译的东西? - 为什么我不能间接引用
self
的get_foo()
-所有的例子我见过使用借入self
语法? - 删除
&
和仅使用意味着什么self
?
学习Rust令人着迷,但是内存安全既令人着迷又令人生畏!
完整的代码可以编译:
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() {}