Условное преобразование стандартного вывода команды в строку не длится достаточно долго - PullRequest
0 голосов
/ 22 сентября 2018

Я пишу приложение, которое должно искать путь двоичного файла, используя 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();
    }
}

детская площадка

Это приводит к следующей ошибке:

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().

Что происходит?Какой лучший способ прочитать стандартный вывод?

1 Ответ

0 голосов
/ 22 сентября 2018

binary_path - это &'static str, потому что оно инициализируется строковым литералом.В результате вызова str::from_utf8 получается &str с более коротким временем жизни, чем это.Вы не можете заставить значение жить дольше.Это огромная причина существования Rust.

Самое простое, что вы можете сделать, это переключиться на String:

let mut binary_path = String::new();

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

Вы также можете использовать Cow, если вы сравниливсегда выделение binary_path плохо сказывается на производительности.

См. также:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...