我有两个类型为 &T
的变量,x
和 y
,我在一个函数中本地交换它们:
pub fn foo<T: Copy>(mut x: &T) {
let y_owned = *x;
let mut y = &y_owned;
for _ in 0..10 {
do_work(x, y);
std::mem::swap(&mut x, &mut y);
}
}
fn do_work<T>(_x: &T, _y: &T) {}
这段代码无法编译,会出现以下错误:
error[E0597]: `y_owned` does not live long enough
--> src/lib.rs:3:22
|
3 | let mut y = &y_owned;
| ^^^^^^^ borrowed value does not live long enough
...
8 | }
| - borrowed value only lives until here
|
note: borrowed value must be valid for the anonymous lifetime #1 defined on the function body at 1:5...
--> src/lib.rs:1:5
|
1 | / pub fn foo<T: Copy>(mut x: &T) {
2 | | let y_owned = *x;
3 | | let mut y = &y_owned;
4 | | for _ in 0..10 {
... |
7 | | }
8 | | }
| |_____^
我不明白为什么它不能工作。虽然
x
和y
的生命周期不同,但为什么编译器要求y
的生命周期与x
相同呢?我只是在foo
内部局部修改引用,并且被引用的对象是保证存在的。一旦foo
返回,这些x
和y
是否存在就无所谓了,对吧?更大的背景是,我正在实现归并排序,想以这种方式交换主数组和辅助(临时)数组。