【问题标题】:Confused about lifetime of variable对变量的生命周期感到困惑
【发布时间】:2014-08-08 06:30:41
【问题描述】:

我正在读取一个文件:

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

内联这些调用有什么特别之处?

【问题讨论】:

    标签: rust


    【解决方案1】:

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

    .as_slice()(然后是.trim())然后引用该数据;它要求该基础值继续存在,以便它可以引用一些东西。

    这就是在这种情况下发生的情况:您没有将 String 存储在变量中,因此它将仅用于表达式,因此 &str 是对该 String 的引用(或它的内容)不能超过表达式。

    因此,在 C 或 C++ 中,可能是释放后使用错误(因为 Stringlet line = …; 行的末尾被释放),或者可能被写为内存泄漏,如果你忽略了String的释放,变成了一个编译错误。

    【讨论】:

    • 在 C++ 中,字符串不会在循环范围内吗?
    • 我假设let line = a_line.unwrap().as_slice().trim(); 形式;我不确定 C++ 的作用域规则是什么,但我假设它们与 Rust 的相似。我肯定是错的。
    • 与 C 和 Java 相同。这是在循环内,因此变量应该一直存在到循环结束。
    • 但是你没有在任何地方分配它 (a_line.unwrap())。
    • 是的,我做到了?将其分配给 line 然后重新分配 line 的值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-26
    • 1970-01-01
    • 2017-11-11
    • 2018-06-15
    • 1970-01-01
    • 2021-09-01
    • 1970-01-01
    相关资源
    最近更新 更多