借用的价值在 Rust 中存活的时间不够长

问题描述 投票:0回答:1
use std::fs::File;
use std::io::{BufRead, BufReader};

fn main() {
    if let Ok(file) = File::open("file.bdf") {
        let reader = BufReader::new(file);
        let satirlar: Vec<String> = reader.lines().map(|line| line.unwrap()).collect();

        let mut GRIDS: Vec<Vec<&str>> = Vec::new();
        let mut CQUAD4: Vec<Vec<&str>> = Vec::new();
        let mut CBAR: Vec<Vec<&str>> = Vec::new();
        let mut RBE3: Vec<Vec<&str>> = Vec::new();

        for (index, satir) in satirlar.iter().enumerate() {
            let a: Vec<&str> = satir.split_whitespace().collect();
            let temp = format!("{} {}", satir, &satirlar[index + 1]);
            let rbe3_concat: Vec<&str> = temp.split_whitespace().collect();
            if a[0] == "GRID" {
                GRIDS.push(a.clone());
            }
            else if a[0] == "CQUAD4" {
                CQUAD4.push(a.clone());
            }
            else if a[0] == "CBAR" {
                CBAR.push(a.clone());
            }
            else if a[0] == "RBE3" {
                RBE3.push(rbe3_concat.clone());
            }
        }

error[E0597]: `temp` does not live long enough
  --> src\main.rs:17:42
   |
16 |             let temp = format!("{} {}", satir, &satirlar[index + 1]);
   |                 ---- binding `temp` declared here
17 |             let rbe3_concat: Vec<&str> = temp.split_whitespace().collect();
   |                                          ^^^^ borrowed value does not live long enough
...
28 |                 RBE3.push(rbe3_concat.clone());
   |                 ---- borrow later used here
29 |             }
30 |         }
   |         - `temp` dropped here while still borrowed

我无法解决这个问题。有人可以帮忙吗? 如果是 RBE3,则应在下一行添加... 我还没有添加代码的其他部分;我在这里遇到问题。

rust borrow-checker borrow
1个回答
0
投票

您试图将对内存 (

&str
) 的引用保存在声明于 块之外,在本例中是
for
循环的范围。那根本行不通。您需要循环外部的 Vec 来拥有内存或指向某些堆分配内存的共享指针:

fn main() {
    let mut rbe3: Vec<Vec<String>> = Vec::new();
    let satirlar = vec!["RBE3 abc", "RBE3 def", "ghi jkl"];

    for (index, satir) in satirlar.iter().enumerate() {
        if index == satirlar.len() - 1 {
            break;
        }
        let a: Vec<&str> = satir.split_whitespace().collect();
        let temp = format!("{} {}", satir, &satirlar[index + 1]);
        let rbe3_concat: Vec<String> = temp.split_whitespace().map(|x| x.to_owned()).collect();
        if a[0] == "RBE3" {
            rbe3.push(rbe3_concat);
        }
    }
    
    println!("{:?}", rbe3);
}

游乐场

注意 Vec 类型的变化,并注意我们将

.to_owned
映射到子块上。另请注意,我们需要注意不要迭代到数组末尾。另请注意,您的全部大写名称会被 rustfmt 拒绝...

您可以像我之前所说的那样,在堆上分配数据并存储一个共享指针

© www.soinside.com 2019 - 2024. All rights reserved.