Compiler errors 删除移动的值后删除部分移动的值

Compiler errors 删除移动的值后删除部分移动的值,compiler-errors,rust,lifetime,Compiler Errors,Rust,Lifetime,我希望下面的代码编译并打印Foo(6),因为b的值在匹配块后被删除,它拥有对a的引用 它似乎与此编译器错误有关: error[E0502]:无法将'a'作为不可变项借用,因为它也是作为可变项借用的 -->src/main.rs:26:22 | 13 |让b=得到|福(&mut a); |-此处发生可变借用 ... 26 | println!(“{:?}”,a); |^此处发生不可变借用 27 | } |-可变借用结束于此 删除b的值也不起作用,因为它被部分移动: 错误[E0382]:使用部分移

我希望下面的代码编译并打印
Foo(6)
,因为
b
的值在匹配块后被删除,它拥有对
a
的引用

它似乎与此编译器错误有关:

error[E0502]:无法将'a'作为不可变项借用,因为它也是作为可变项借用的
-->src/main.rs:26:22
|
13 |让b=得到|福(&mut a);
|-此处发生可变借用
...
26 | println!(“{:?}”,a);
|^此处发生不可变借用
27 | }
|-可变借用结束于此
删除
b
的值也不起作用,因为它被部分移动:

错误[E0382]:使用部分移动的值:`b`
-->src/main.rs:24:10
|
18 |一些(值)=>*值=y,
|----值移到了这里
...
24 |下降(b);
|^移动后此处使用的值
|
=注意:发生移动是因为`(b:std::prelude::v1::Some).0`具有类型`&mut u32`,该类型不实现“复制”特性
有没有更好的方法来解决这个问题,而不是将行
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);
}
#[派生(调试)]
结构Foo(u32);
fn get_foo(bar:&mut foo)->选项{
部分(&mut bar.0)
}
pub-fn测试(){
设mut x=5;
设mut y=6;
设muta=Foo(x);
// {
设b=get_foo(&mut a);
比赛b{
一些(值)=>*值=y,
_ => (),
}
// }
//下降(b);
println!(“{:?}”,a);
}
有没有更好的方法来解决这个问题

是的,但不是在稳定的锈迹中。您需要非词汇生存期:

#![专题(nll)]
#[导出(调试)]
结构Foo(u32);
fn get_foo(bar:&mut foo)->选项{
部分(&mut bar.0)
}
pub-fn测试(){
设x=5;
设y=6;
设muta=Foo(x);
设b=get_foo(&mut a);
如果让一些(值)=b{
*值=y;
}
println!(“{:?}”,a);
}
fn main(){}
在此之前,只需使用额外的块

删除b的值也不起作用

drop
与借款无关

另见:


为什么跌落与此无关?据我所知,编译器正在抱怨
b
正在/可能正在保存
a
的引用。放下
b
应该会解决这个问题,不是吗?NLL会处理它,我应该仔细阅读它到底是什么,但我也对drop的问题感兴趣。@ÁkosVandra如果我链接到()的第一个问题中有什么你不理解的地方,也许添加评论会更合适。
#![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() {}