我有这个代码,借用检查器显示错误:
fn f1(v: &str) {
}
fn main() {
let c = |v| f1(v);
for _ in 0..1 {
let s = String::new();
c(&s);
}
}
|
10 | c(&s);
| - ^^ borrowed value does not live long enough
| |
| borrow later used here
11 | }
| - `s` dropped here while still borrowed
但是如果我向闭包添加显式类型,代码就会编译
let c = |v: &str| f1(v);
有人可以解释为什么它在第二种情况下工作而不是在第一种情况下工作,因为我理解 rust 在第一个示例中正确推断出相同的类型(因为如果我在循环之外运行闭包,它会工作)?
borrowed value does not live long enough
&str
具有静态生命周期,这意味着保证在整个程序的持续时间内有效。
但是 ref String(
&s
) 只存在于循环迭代中。
例如,没有循环,就可以正常编译:
fn main() {
let c = |v| f1(v);
let s = String::new();
c(&s);
}