对变量的生命周期感到困惑

时间:2014-08-07 21:43:21

标签: rust

我正在读一个文件:

let mut file = BufferedReader::new(File::open(path));
let mut first: bool = true;
for a_line in file.lines() {
    let mut line = a_line.unwrap();
    let line = line.as_slice().trim();
    if first && line != "[shogun]" {
        //let line = a_line.unwrap().as_slice().trim();
        //if first &&  line.trim() != "[shogun]" {
        return None;
    }
    first = false;
}
return Some(Settings { log: String::new() });

这很好用。但是,如果我尝试内联line

的创建
let line = a_line.unwrap().as_slice().trim();

我得到一个奇怪的错误:

error: borrowed value does not live long enough

内联这些电话有什么特别之处?

1 个答案:

答案 0 :(得分:1)

a_line.unwrap()String。它拥有它的内容。

.as_slice()(然后依次为.trim())然后引用该数据;它要求该基值继续存在,以便可以引用它。

这就是在这种情况下发生的事情:你没有将String存储在一个变量中,因此它只适用于表达式,因此&str是对{的引用String {1}}(或其内容)不能比表达式更长。

因此,在C或C ++中会出现一个免费使用后的错误(因为Stringlet line = …;行的末尾被释放),或者可能被写为内存泄漏,如果您省略了String的释放,则会出现编译错误。