gpt4 book ai didi

rust - 有条件地将命令的标准输出转换为字符串的时间不够长

转载 作者:行者123 更新时间:2023-11-29 08:29:29 26 4
gpt4 key购买 nike

我正在编写一个需要使用 which 查找二进制文件路径的应用程序。我已经知道如何运行命令,但我无法将 output.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();
}
}

playground

这会导致以下错误:

error[E0597]: `output.stdout` does not live long enough
--> src/main.rs:14:40
|
14 | _binary_path = str::from_utf8(&output.stdout).unwrap();
| ^^^^^^^^^^^^^ borrowed value does not live long enough
15 | }
| - `output.stdout` dropped here while still borrowed
16 | }
| - borrowed value needs to live until here

尽管我已经阅读了文档,但借用和引用仍然让我有些困惑。我知道输出的生命周期是有限的,因为它存在于 if 语句中。我不明白为什么它不允许我将值复制到 main() 函数的范围内。

这是怎么回事?阅读标准输出的最佳方式是什么?

最佳答案

binary_path 是一个 &'static str 因为它被初始化为字符串文字。调用 str::from_utf8 的结果是 &str,其生命周期比它短。您无法值(value)活得更久。这是 Rust 存在的重要原因。

您可以做的最简单的事情就是切换到 String:

let mut binary_path = String::new();

if interpreter.is_empty() {
// ...
binary_path = String::from_utf8(output.stdout).unwrap();
}

如果您的基准测试表明总是分配 binary_path 会降低性能,您也可以使用 Cow

另见:

关于rust - 有条件地将命令的标准输出转换为字符串的时间不够长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52457699/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com