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,则应在下一行添加... 我还没有添加代码的其他部分;我在这里遇到问题。
您试图将对内存 (
&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 拒绝...
您可以像我之前所说的那样,在堆上分配数据并存储一个共享指针。