【发布时间】:2023-03-18 12:00:01
【问题描述】:
我有一个特质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
}
}
但现在我在尝试取消引用 self 时收到 error: cannot move out of dereference of `&`-pointer。
改成
impl Bar {
fn get_foo(self) -> Box<Foo> {
self.foo
}
}
一切都好。
所以....
- 为什么
&在bar结构中不起作用?我假设我必须装箱 由于结构有一个固定的内存布局,所以我们不得不说它是一个指针 到一个特征(因为我们不知道它会有多大),但为什么 编译器建议一些不会编译的东西? - 为什么我不能在
get_foo()中取消引用self- 我看到的所有示例都使用借用的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() {}
【问题讨论】: