为什么 "borrowed value does not live long enough" 使用 Self 而不是特定类型?
Why "borrowed value does not live long enough" with Self but not specific type?
以下代码:
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);
}
}
为什么第一个代码失败而第二个没有?是否可以更改第一个代码以使其编译?
因为生命周期省略。您的第一个示例(带有 Self
)等效于此代码:
trait Passable: Sized {
fn call<F: Fn(Self)>(f: F);
}
impl<'a> Passable for &'a [i32] {
fn call<F: Fn(&'a [i32])>(f: F) {
let vec = vec![1, 2, 3];
f(&vec);
}
}
请注意,这里 f
的参数 与 Self
的生命周期相同,但 vec
的生命周期更短。
另一方面,您的第二个示例等效于此代码:
trait Passable: Sized {
fn call<'b, F: Fn(&'b [i32])>(f: F);
}
impl<'a> Passable for &'a [i32] {
fn call<'b, F: Fn(&'b [i32])>(f: F) {
let vec = vec![1, 2, 3];
f(&vec);
}
}
Self
和 f
的参数使用不同的生命周期。
以下代码:
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);
}
}
为什么第一个代码失败而第二个没有?是否可以更改第一个代码以使其编译?
因为生命周期省略。您的第一个示例(带有 Self
)等效于此代码:
trait Passable: Sized {
fn call<F: Fn(Self)>(f: F);
}
impl<'a> Passable for &'a [i32] {
fn call<F: Fn(&'a [i32])>(f: F) {
let vec = vec![1, 2, 3];
f(&vec);
}
}
请注意,这里 f
的参数 与 Self
的生命周期相同,但 vec
的生命周期更短。
另一方面,您的第二个示例等效于此代码:
trait Passable: Sized {
fn call<'b, F: Fn(&'b [i32])>(f: F);
}
impl<'a> Passable for &'a [i32] {
fn call<'b, F: Fn(&'b [i32])>(f: F) {
let vec = vec![1, 2, 3];
f(&vec);
}
}
Self
和 f
的参数使用不同的生命周期。