gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 11:27:24 25 4
gpt4 key购买 nike

一些 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()
}

假设我想提取 Bar 的创建,以便将 XGetterBar 的创建封装在一起,这样baz() 现在显示为:

fn baz2() -> i32 {
let bar = createBar(42);
bar.get_x()
}

但是,通过在下面实现 createBar,我运行了一个借用检查器的 fowl:

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
}

如何提取一个不违反借用规则的函数createBar

最佳答案

createBar() 中的 foo 在函数结束时消失,因此您返回的 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
}

关于rust - 提取在 Rust 中创建实例的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63953265/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com