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

提取在Rust中创建实例的函数,rust,Rust,一个初学者的问题-假设我有以下代码,可以编译: trait XGetter{ fn get_x(&self)->i32; } 结构Foo{ x:i32 } 用于Foo的impl-XGetter{ fn get_x(&self)->i32{ self.x } } 结构条{ fn get_x(&self)->i32{ self.0.get_x() } } fn baz()->i32{ 设foo=foo{x:42}; 设bar=bar(&foo); bar.get_x() } 假设我想提取出Bar的

一个初学者的问题-假设我有以下代码,可以编译:

trait XGetter{
fn get_x(&self)->i32;
}
结构Foo{
x:i32
}
用于Foo的impl-XGetter{
fn get_x(&self)->i32{
self.x
}
}
结构条{
fn get_x(&self)->i32{
self.0.get_x()
}
}
fn baz()->i32{
设foo=foo{x:42};
设bar=bar(&foo);
bar.get_x()
}
假设我想提取出
Bar
的创建,以便将
XGetter
Bar
的创建封装在一起,这样
baz()
现在的内容如下:

fn baz2()->i32{
设bar=createBar(42);
bar.get_x()
}
但是,通过实现下面的
createBar
,我运行了借用检查器的a-foll:

fn创建栏{
设foo=foo{x};
设bar=bar(&foo);
//---“foo”是在这里借来的
酒吧
//^^^返回一个值,该值引用当前函数拥有的数据
}

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

签名
结构栏{
设foo=foo{x};
设bar=bar(&foo);
//---“foo”是在这里借来的
酒吧
//^^^返回一个值,该值引用当前函数拥有的数据
}
^^^这意味着变量
foo
将仅在
createBar
范围内有效

也就是说,您可以使用:


fn createBar(g:&dyn XGetter)->Bar函数结束时,
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
}
结构条(框);
棒材用impl-XGetter{
fn get_x(&self)->i32{
self.0.get_x()
}
}
fn createBar(x:i32)->Bar{
设foo=Box::new(foo{x});
设bar=bar(foo);
酒吧
}

谢谢您的回答。然而,
createBar
在构造函数本身之上没有任何用途。其思想是将
XGetter
的创建封装为
createBar
函数中
Foo
的一个实例。@dav_i,例如。这毫无意义。您不应该使用引用,而应该使用
Bar
own
Foo