rust - 无法调用盒装特征对象上的方法,因为它的寿命不够长
问题描述
我想编写一个函数来解析字符串并返回实现特征对象的几个结构之一,该对象允许分发对实现结构的引用。用例是从配置文件中读取一个字符串,以确定使用哪个实现。代码如下所示:
trait Foo<'a> {
fn get(&'a self) -> &'a i32;
}
struct Bar {
data: i32,
}
impl<'a> Foo<'a> for Bar {
fn get(&'a self) -> &'a i32 {
&self.data
}
}
struct Baz {
data: i32,
}
impl<'a> Foo<'a> for Baz {
fn get(&'a self) -> &'a i32 {
&self.data
}
}
fn get_foo(foo: &str) -> Box<dyn Foo> {
let split = foo.splitn(2, "+").collect::<Vec<_>>();
let data = i32::from_str_radix(split[1], 10).unwrap();
if foo.starts_with("bar") {
Box::new(Bar { data })
} else {
Box::new(Baz { data })
}
}
fn main() {
let foo = get_foo("bar+0");
println!("Foo: {}", foo.get());
}
但是,当我这样做时,我收到此错误:
error[E0597]: `*foo` does not live long enough
--> src/main.rs:38:25
|
38 | println!("Foo: {}", foo.get());
| ^^^ borrowed value does not live long enough
39 | }
| - `*foo` dropped here while still borrowed
|
= note: values in a scope are dropped in the opposite order they are created
这可以在 Rust 中做到吗?
解决方案
感谢@Shepmaster 指出特征对象的生命周期不是要走的路。将生命周期转移到单个方法(在此示例中可以省略)效果很好:
trait Foo {
fn get(&self) -> &i32;
}
struct Bar {
data: i32,
}
impl Foo for Bar {
fn get(&self) -> &i32 {
&self.data
}
}
struct Baz {
data: i32,
}
impl Foo for Baz {
fn get(&self) -> &i32 {
&self.data
}
}
fn get_foo(foo: &str) -> Box<dyn Foo> {
let split = foo.splitn(2, "+").collect::<Vec<_>>();
let data = i32::from_str_radix(split[1], 10).unwrap();
if foo.starts_with("bar") {
Box::new(Bar { data })
} else {
Box::new(Baz { data })
}
}
fn main() {
let foo = get_foo("bar+0");
println!("Foo: {}", foo.get());
}
推荐阅读
- sql - 下级表可能没有所有预期值的问题构建视图
- r - 如何将闪亮的应用程序放大到(浏览器)窗口大小?
- angular - Angular 9 中 FormControl 的单元测试:TypeError:无法读取 null 的属性“验证”(Validators.compose)
- flutter - 将平铺图像背景添加到颤动的文本字段中
- python - 在 Python 中实时不断变化的更新列表
- arrays - 如何查找数组中的元素个数?
- python - 使用 Python PIL/pillow 调整图像大小的问题
- c# - 第二次创建实例时从容器中获取的同一个瞬态实例
- reactjs - 使用 socket.io 时,如何优化用户之间的同步文本输入?
- javascript - 尝试创建我的第一个 React 项目并遇到“找不到二进制脚本”错误