我遇到了一个Rust借用检查器错误,我相信这是非词法生命周期当前实现的限制。我想要编写的代码大致如下:
struct Thing {
value: i32
}
impl Thing {
fn value(&self) -> &i32 {
&self.value
}
fn increment(&mut self) {
self.value += 1;
}
}
/// Increments the value of `thing` if it is odd, and returns a reference to the value.
fn increment_if_odd(thing: &mut Thing) -> &i32 {
let ref_to_value = thing.value();
if (*ref_to_value % 2) == 0 {
return ref_to_value;
}
thing.increment(); // fails to compile because the immutable borrow `ref_to_value` is still alive
thing.value()
}
第一个问题:我是否正确地认为这段代码是100%安全的,而借用检查器过于保守?返回ref_to_value
的分支不会改变thing
,因此可以保证引用有效,而另一个分支根本不使用ref_to_value
。看起来我可以通过“洗涤”指针来解决这个问题:
if (*ref_to_value % 2) == 0 {
return unsafe {
&*(ref_to_value as *const i32)
}
}
第二个问题:这个是不是非常安全?我以前从来没有使用过unsafe,所以我很紧张。
我想第三个问题是:有没有一种安全的Rust重写方法?限制是在不可变路径上只调用一次'value'。我猜还有第三个问题:是否有一种安全的Rust重写方式?限制是在不可变路径上仅调用一次'value'。