我想编写以下函数:
我的Rust生命周期的心智模型认为这段代码是正确的。我将
如果我要求
这让我想到,类型
Rust行为背后的正确解释是什么?为什么引用的引用会以我认为的方式而非另一种方式表现?
fn foo<'a, 'b, 'c>(rr1: &'a mut &'c mut u32, rr2: &'b mut &'c mut u32) {
*rr1 = *rr2;
}
但编译器报错了:
error[E0623]: lifetime mismatch
--> src/lib.rs:2:12
|
1 | fn foo<'a, 'b, 'c>(rr1: &'a mut &'c mut u32, rr2: &'b mut &'c mut u32) {
| ----------- ------------------- these two types are declared with different lifetimes...
2 | *rr1 = *rr2;
| ^^^^ ...but data from `rr2` flows into `rr1` here
我的Rust生命周期的心智模型认为这段代码是正确的。我将
rr2
的类型解读为“一个有着生命周期'b
的引用,指向一个有着生命周期'c
的引用,指向一个u32
类型”。因此,当我对rr2
进行解引用操作时,我得到的是一个有着生命周期'c
的引用,指向一个u32
类型。这个值应该安全地存储在与之相同类型的*rr1
上。如果我要求
'b
的寿命超过'c
,那么它就可以正常工作:fn foo<'a, 'b: 'c, 'c>(rr1: &'a mut &'c mut u32, rr2: &'b mut &'c mut u32) {
*rr1 = *rr2;
}
这让我想到,类型
&'b mut &'c mut u32
意味着引用链末尾的u32
只在'b
和'c
交叉期间可用。Rust行为背后的正确解释是什么?为什么引用的引用会以我认为的方式而非另一种方式表现?