我正在尝试创建两个结构体来操作底层数据集;一个提供不可变的“读”操作,另一个允许修改。为了使其工作,我需要能够在修改对象中使用读取函数-因此,在修改函数中创建一个临时的新读取对象,以便查看底层数据。
以下是一些代码:
以下是一些代码:
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());
}
它无法编译 - 尽管我尽了最大的努力,但似乎从 Read::get
返回的引用生命周期绑定到了 Write::get
的作用域,而不是 Write
的 'db
生命周期。我该如何使其编译?(并且,我想做的事情可行吗?这是最简单/最简洁的方法吗?)
&mut
,那么根本就不需要'a
。这似乎有点奇怪。 - Shepmasteras_read()
,则最终会得到两个对i32的&mut
引用。您可以看到,如果在as_read
中将其重新借用为不可变,则可以使用@Wavin的代码:http://is.gd/Nt66hL 这可能是更好的答案。我会更新我的代码。 - oli_obk&'db self
。虽然我理解这样做的原理,但我认为只有&self
也应该可以工作。生命周期省略会为self
插入一个'a
,但这并不重要,因为我们正在复制内部引用及其生命周期。也许复制不起作用是因为有mut
? - Shepmaster&mut
总是被重新借用或移动,但无法复制。我猜 rustc 无法理解'a:'db
,尽管这在这里应该很明显。 - oli_obk