【发布时间】:2021-12-26 09:08:14
【问题描述】:
以下代码:
trait Passable: Sized {
fn call<F: Fn(Self)>(f: F);
}
impl Passable for &[i32] {
fn call<F: Fn(Self)>(f: F) {
let vec = vec![1, 2, 3];
f(&vec);
}
}
给出错误
error[E0597]: `vec` does not live long enough
--> src/main.rs:8:11
|
8 | f(&vec);
| ^^^^ borrowed value does not live long enough
9 | }
| - `vec` dropped here while still borrowed
相比之下,如果我编写相同的东西,但使用固定类型 &[i32] 而不是 Self,它会编译:
trait Passable: Sized {
fn call<F: Fn(&[i32])>(f: F);
}
impl Passable for &[i32] {
fn call<F: Fn(&[i32])>(f: F) {
let vec = vec![1, 2, 3];
f(&vec);
}
}
为什么第一个代码失败而第二个代码失败?并且可以更改第一个代码以使其编译吗?
【问题讨论】:
标签: rust borrow-checker