我测试了一个包含生命周期的小例子,但有时我无法理解问题,比如这里:
struct Space<'r> {
v: &'r mut usize,
z: usize,
}
impl<'r> Space<'r> {
fn new(v: &'r mut usize) -> Self {
Self { v, z: 0 }
}
fn add(&'r mut self) {
self.z += 1;
*self.v = self.z
}
fn make_val(&'r mut self, v: u32) -> Val<'r> {
Val::new(self, v)
}
}
struct Val<'r> {
space: &'r mut Space<'r>,
v: u32,
}
impl<'r> Val<'r> {
fn new(space: &'r mut Space<'r>, v: u32) -> Self {
Self { space, v }
}
}
impl<'r> Clone for Val<'r> {
fn clone(&self) -> Self {
self.space.add();
Self { space: self.space, v: self.v }
}
}
fn main() {
let mut v = 0usize;
let mut space = Space::new(&mut v);
let mut val1 = space.make_val(1234);
let mut val2 = val1.clone();
println!("Res: {} - {}/{}", v, val1.v, val2.v);
}
出现了两个编译错误,第一个在第34行的错误非常奇怪,它说生命周期无法超过方法调用是内部的,没有任何东西被传递到外面。第36行的错误对我来说很难解决。
请问你能解释一下这些问题,并告诉我如何解决吗?
clone
方法中,你是否打算修改原始值? - Solomon UckoRefCell
来延迟到运行时进行借用,但是 Rust 的方法是尽可能避免使用引用。 在您的示例中,我没有任何特定原因不使用拥有值。 - Alexey Larionov