Rust 有条件地将命令的标准输出转换为字符串的时间不够长
我正在编写一个应用程序,它需要使用Rust 有条件地将命令的标准输出转换为字符串的时间不够长,rust,command,Rust,Command,我正在编写一个应用程序,它需要使用查找二进制文件的路径,而是。我已经知道了如何运行命令,但是我无法将输出.stdout存储到我可以使用的变量中 use std::process::Command; use std::str; fn main() { let interpreter: &str = "php72"; let binary: &str = "composer"; let mut _binary_path: &str = "";
查找二进制文件的路径,而是。我已经知道了如何运行命令,但是我无法将输出.stdout
存储到我可以使用的变量中
use std::process::Command;
use std::str;
fn main() {
let interpreter: &str = "php72";
let binary: &str = "composer";
let mut _binary_path: &str = "";
if interpreter != "" {
let output = Command::new("which")
.arg(binary)
.output()
.expect("Execution of 'which' failed.");
_binary_path = str::from_utf8(&output.stdout).unwrap();
}
}
这将导致以下错误:
错误[E0597]:`output.stdout`的寿命不够长
-->src/main.rs:14:40
|
14 |_binary_path=str::from_utf8(&output.stdout).unwrap();
|^^^^^^^^^^^^^^^^^^借来的价值寿命不够长
15 | }
|-`output.stdout`在仍被借用时被丢弃在此处
16 | }
|-借来的价值需要一直存在到这里
借用和引用对我来说仍然有点混乱,尽管我已经阅读了文档。我知道输出的生命周期是有限的,因为它存在于if
语句中。我不明白为什么它不允许我将值复制到main()
函数的作用域中
发生什么事了?读取标准输出的最佳方式是什么?二进制路径是一个&'static str
,因为它被初始化为字符串文本。从_utf8
调用str::的结果是&str
的生存期短于此。您无法使该值的寿命更长。这是生锈存在的一个巨大原因
您可以做的最简单的事情是切换到字符串
:
let mut binary_path = String::new();
if interpreter.is_empty() {
// ...
binary_path = String::from_utf8(output.stdout).unwrap();
}
如果您对始终分配二进制路径
的性能不佳进行了基准测试,则还可以使用Cow
另见:
输出
的生命周期在您的if解释器内!=“{
分支-一个简单的解决方案是使用所拥有的字符串
类型,它也可能有助于代码的人体工程学。字符串
可以作为&str
传递到下一行:&String
-请参阅: