提取在 Rust 中创建实例的函数

dav*_*v_i 2 rust

一个 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,为了封装的创造XGetterBar一起,这样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不违反借用规则的函数?

Aco*_*orn 5

foocreateBar()模具当函数结束时,让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)