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
-请参阅: