Rust中参考文献的分配

Rust中参考文献的分配,rust,Rust,以下代码未编译,因为移动后使用了x(因为x具有类型&mut u8,这不实现复制特性) 据我所知,y隐式地具有类型&mut u8 但是如果我明确指定y的类型,它将编译。下面的代码编译 fn main() { let mut a: u8 = 1; let x: &mut u8 = &mut a; let y: &mut u8 = x; x; } 顺便说一下,如果我改变让y:&mut u8=x至设y:&u8=x它也可以编译 在我看来,似乎什么都

以下代码未编译,因为移动后使用了
x
(因为
x
具有类型
&mut u8
,这不实现
复制
特性)

据我所知,
y
隐式地具有类型
&mut u8

但是如果我明确指定
y
的类型,它将编译。下面的代码编译

fn main() {
    let mut a: u8 = 1;
    let x: &mut u8 = &mut a;
    let y: &mut u8 = x;
    x;
}
顺便说一下,如果我改变
让y:&mut u8=x
设y:&u8=x它也可以编译

在我看来,似乎什么都没有改变,
y
在第一个示例中是
&mut u8
,在第二个示例中是
&mut u8
,但前者不编译,后者编译


为什么??区别是什么?

&mut u8
不是一个完整的类型。所有引用类型都必须具有生存期参数。当您删除它时,Rust编译器必须推断它,它将选择尽可能短的生存期。在第一个示例中,脱胶的第一步是(使用):

这仍然不是完全明确的,因为
y
的类型仍然未知。这是怎么一回事?因为它是从
x
分配的,这是一个
和一个mut u8
,所以它也应该是一个
和一个mut u8
。请注意,这并没有遵循寿命省略的“可能的最短寿命”规则。你没有省略一辈子,你省略了整个类型,它是通过类型推断重建的

fn main() {
    let mut a: u8 = 1;
    'a: {
    let x: &'a mut u8 = &'a mut a; // the lifetime of x must last until its use at the end
    let y: &'a mut u8 = x;
    x;
    }
}
那可不行。由于
y
x
具有相同的生存期,因此其创建涉及移动
x
中的引用并使
x
无效。因此,该程序因试图使用
x
而被拒绝

将签名添加到
y
本质上为编译器提供了一个新的位置,在那里它可以推断生命周期。以前,正常的类型推断使得
y
x
具有相同的类型,这意味着它持续的时间与
x
一样长,并且使得
x
不可用。现在,
y
不需要具有与
x
相同的类型;借用的生命周期可能不同。特别是,它被缩短了

fn main() {
    let mut a: u8 = 1;
    'a: {
    let x: &'a mut u8 = &'a mut a; // the lifetime of x must last until it's use at the end
    'b: {
    let y: &'b mut u8 = x; // y and x can now have different lifetimes, *x is reborrowed here
    }
    x; // x not moved from, still valid
    }
}
现在,不是将引用
x
移动到
y
并使其无效,而是将值
*x
临时“重新加载”以使
y
,如
让y:&'b mut u8=&'b mut*x

另一种可能的修复方法是明确地说“借用
*x
使用不同的生存期”:


原理和以前一样:更频繁地说
&
会给编译器更多的空间,让它可以调整程序中的生命周期,使一切正常工作。

“据我所知,y隐式地具有type&mut u8”
我目前没有IDE,但我认为这是错误的,y的类型是
&u8
让y:&u8=x也编译我当时错了。你能告诉我错误信息吗?
error[E0382]:使用移动值:
x``链接到rust游乐场谢谢你的回答!请您也简单地回答一下,我们这里不是同时有两个对
a
的可变引用吗?这也可以用生命周期来解释吗?所以我们有一个借贷者
x
,然后只有一个借贷者
y
,然后又是
x
?我不认为这是由生命周期解释的,不。借贷者检查器跟踪
a
是由
x
借来的,然后是由
y
,然后是由
x
借来的,但我不相信这真的被写进了人生。不过我不确定。
fn main() {
    let mut a: u8 = 1;
    'a: {
    let x: &'a mut u8 = &'a mut a; // the lifetime of x must last until its use at the end
    let y: &'a mut u8 = x;
    x;
    }
}
fn main() {
    let mut a: u8 = 1;
    'a: {
    let x: &'a mut u8 = &'a mut a; // the lifetime of x must last until it's use at the end
    'b: {
    let y: &'b mut u8 = x; // y and x can now have different lifetimes, *x is reborrowed here
    }
    x; // x not moved from, still valid
    }
}
fn main() {
    let mut a: u8 = 1;
    let x: &mut u8 = &mut a;
    let y = &mut *x;
    x;
}