如果未明确提供类型,借用检查器会抱怨循环内的闭包

问题描述 投票:0回答:1

我有这个代码,借用检查器显示错误:

https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=55d050b6f25410ce0e17ef9e844b048d

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);

https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=54ca20dff5bdf1831ec705481e4936bb

有人可以解释为什么它在第二种情况下工作而不是在第一种情况下工作,因为我理解 rust 在第一个示例中正确推断出相同的类型(因为如果我在循环之外运行闭包,它会工作)?

rust borrow-checker
1个回答
0
投票

borrowed value does not live long enough

&str
具有静态生命周期,这意味着保证在整个程序的持续时间内有效。

但是 ref String(

&s
) 只存在于循环迭代中。

例如,没有循环,就可以正常编译:

fn main() {                                                                                                                                                                                                                           
     let c = |v| f1(v);                                                                                                                                                                                      
     let s = String::new();                                                                                                                                                                                              
     c(&s);                                                                                                                                                                                        
}
© www.soinside.com 2019 - 2024. All rights reserved.