提取在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
ownFoo