一个 Rust 初学者问题 - 假设我有以下代码,它可以编译:
trait XGetter {
fn get_x(&self) -> i32;
}
struct Foo {
x: i32
}
impl XGetter for Foo {
fn get_x(&self) -> i32 {
self.x
}
}
struct Bar<'a>(&'a dyn XGetter);
impl<'a> XGetter for Bar<'a> {
fn get_x(&self) -> i32 {
self.0.get_x()
}
}
fn baz() -> i32 {
let foo = Foo { x: 42 };
let bar = Bar(&foo);
bar.get_x()
}
Run Code Online (Sandbox Code Playgroud)
比方说,我想提取出来的创作Bar,为了封装的创造XGetter和Bar一起,这样baz(),原先为:
fn baz2() -> i32 {
let bar = createBar(42);
bar.get_x()
}
Run Code Online (Sandbox Code Playgroud)
但是,通过createBar下面的实现,我运行了一个借用检查器:
fn createBar<'a>(x: i32) -> Bar<'a> {
let foo = Foo { x };
let bar = Bar(&foo);
// ---- `foo` is borrowed here
bar
// ^^^ returns a value referencing data owned by the current function
}
Run Code Online (Sandbox Code Playgroud)
如何提取一个createBar不违反借用规则的函数?
将foo在createBar()模具当函数结束时,让bar您返回将指向无效的内存。
鉴于你是如何写的调用createBar(42),它看起来像你想Bar给自己的Foo,这样做的:
struct Bar(Box<dyn XGetter>);
impl XGetter for Bar {
fn get_x(&self) -> i32 {
self.0.get_x()
}
}
fn createBar(x: i32) -> Bar {
let foo = Box::new(Foo { x });
let bar = Bar(foo);
bar
}
Run Code Online (Sandbox Code Playgroud)