我希望以下代码能够编译并打印Foo(6)
,因为b
的值会在匹配块之后删除对a
的引用。
似乎与此编译器错误有关:
error[E0502]: cannot borrow `a` as immutable because it is also borrowed as mutable
--> src/main.rs:26:22
|
13 | let b = get_foo(&mut a);
| - mutable borrow occurs here
...
26 | println!("{:?}", a);
| ^ immutable borrow occurs here
27 | }
| - mutable borrow ends here
删除b
的值也不起作用,因为它已被部分移动:
error[E0382]: use of partially moved value: `b`
--> src/main.rs:24:10
|
18 | Some(value) => *value = y,
| ----- value moved here
...
24 | drop(b);
| ^ value used here after move
|
= note: move occurs because `(b:std::prelude::v1::Some).0` has type `&mut u32`, which does not implement the `Copy` trait
有没有更好的方法来解决这个问题,而不是将行let b
和match b
放入内部块?这看起来很奇怪和丑陋。
编译器是否应该理解该引用已被删除,并且能够编译该代码?
#[derive(Debug)]
struct Foo(u32);
fn get_foo(bar: &mut Foo) -> Option<&mut u32> {
Some(&mut bar.0)
}
pub fn test() {
let mut x = 5;
let mut y = 6;
let mut a = Foo(x);
// {
let b = get_foo(&mut a);
match b {
Some(value) => *value = y,
_ => (),
}
// }
// drop(b);
println!("{:?}", a);
}
答案 0 :(得分:3)
有没有更好的方法来解决这个问题
是的,但不是稳定的Rust。你需要非词汇生命周期:
#![feature(nll)]
#[derive(Debug)]
struct Foo(u32);
fn get_foo(bar: &mut Foo) -> Option<&mut u32> {
Some(&mut bar.0)
}
pub fn test() {
let x = 5;
let y = 6;
let mut a = Foo(x);
let b = get_foo(&mut a);
if let Some(value) = b {
*value = y;
}
println!("{:?}", a);
}
fn main() {}
在此之前,只需使用额外的块。
删除b的值不起作用
drop
与借用无关。
另见: