我正在尝试制作两个在底层数据集上运行的结构体; 一个提供不可变的"读取"操作,另一个允许修改.为此,我需要能够在修改对象中使用读取函数 - 因此,我在修改器函数中创建一个临时的新读取对象,并查看基础数据.
这是一些代码:
struct Read<'db> {
x: &'db i32
}
impl<'db> Read<'db> {
pub fn get(&'db self) -> &'db i32 { self.x }
}
struct Write<'db> {
x: &'db mut i32
}
impl<'db> Write<'db> {
fn new(x: &mut i32) -> Write { Write{x: x} }
fn as_read(&'db self) -> Read<'db> {
Read{x: self.x}
}
pub fn get(&'db self) -> &'db i32 { self.as_read().get() }
}
fn main() {
let mut x = 69i32;
let y = Write::new(&mut x);
println!("{}", y.get());
}
Run Code Online (Sandbox Code Playgroud)
它不会编译-它似乎是,尽管我尽了最大努力,参考的寿命从返回Read::get被绑定到Write::get的范围,而不是Write的'db寿命.我怎样才能编译?(并且,我想做的是什么?这是最简单/最简洁的方式吗?)
编译器试图传达的重点是,这&'db self实际上意味着self: &'db Write<'db>. 这意味着您将引用和类型绑定到相同的生命周期。在你的情况下,你真正想要的是仅仅为了功能而存在的self: &'a Write<'db>地方。为了能够从引用返回引用,您需要通过 constraining指定 其生命周期至少与 一样长。'aas_read'db'a'a'db'a: 'db
fn as_read<'a: 'db>(self: &'a Write<'db>) -> Read<'db> {
Read{x: self.x}
}
pub fn get<'a: 'db>(self: &'a Write<'db>) -> &'db i32 { self.as_read().get() }
Run Code Online (Sandbox Code Playgroud)
或者更简洁地
fn as_read<'a: 'db>(&'a self) -> Read<'db> {
Read{x: self.x}
}
pub fn get<'a: 'db>(&'a self) -> &'db i32 { self.as_read().get() }
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
57 次 |
| 最近记录: |