【发布时间】:2022-01-01 05:16:21
【问题描述】:
我一边看书一边尝试学习生锈的手。 所以我的程序试图从 macOS 读取 SPDisplaysDataType 并且我想以某种方式构造这个命令的输出(还不知道如何实现这一点,任何想法都会受到欢迎)。
现在我似乎无法编译,因为我无法弄清楚这个借用错误。
use std::process::Command;
fn main() {
let output = Command::new("system_profiler")
.arg("SPDisplaysDataType")
.output()
.expect("Failed getting display data");
let display_text = String::from_utf8(output.stdout)
.expect("Cannot read string from output");
let mut gpus: Vec<Vec<&str>> = Vec::new();
let mut gpu_structure: Vec<&str> = Vec::new();
for (index, line) in display_text.lines().enumerate() {
if line.contains("Chipset Model") {
gpus.push(gpu_structure.clone());
gpu_structure = Vec::new();
let mut gpu_title_string = format!("{}", index);
gpu_title_string.push_str(line);
let cloned = gpu_title_string.clone();
gpu_structure.push(cloned.as_str());
continue;
}
gpu_structure.push(line);
}
}
我得到的错误是:
|
21 | gpus.push(gpu_structure.clone());
| ------------- borrow later used here
...
29 | gpu_structure.push(cloned.as_str());
| ^^^^^^ borrowed value does not live long enough
30 | continue;
31 | }
| - `cloned` dropped here while still borrowed
【问题讨论】:
-
cloned是一个临时变量,所以它的借用(正如编译器所说的那样)活得不够长。如果您在循环中创建字符串,则需要将gpu_structure设为Vec<String>,并使用gpu_structure.push(cloned)。
标签: rust borrow-checker