Это что-то вроде заимствования Rust?

Когда я пытаюсь запустить другое приложение, пишу что-нибудь на его стандартном вводе, а затем жду его завершения, мой код выглядит примерно так (old_io):

let mut process = Command::new("example_app")
.arg("test").spawn().ok().expect("Failed.");

{
    let mut std = &mut process.stdin.as_mut().unwrap();
    std.write_all(input_example);
}

let output = process.wait_with_output().ok().expect("Failed.");

Это работает, но мне кажется, что это не лучший вариант. Поскольку "& mut process.stdin.as_mut (). Unwrap ()" похоже заимствует "process", мне нужно убедиться, что он выходит за пределы области видимости, прежде чем обращаться к нему снова, не так ли? И еще вопрос: зачем вообще нужно заимствовать «процесс»? »


person Reignbeaux    schedule 21.02.2015    source источник


Ответы (2)


Зачем вообще нужно заимствовать «процесс»? »

Потому что вы используете Option::as_mut. Подпись выглядит так:

fn as_mut<'r>(&'r mut self) -> Option<&'r mut T>

Это говорит о том, что время жизни возвращаемого значения привязано к вводу. Кроме того, это изменяемая ссылка, из которой вам разрешено иметь только одну в определенное время (для предотвращения псевдонима).

Причина, по которой вам нужно добавить новую область, заключается в том, что области заимствования имеют лексическую область видимости . Это раздражающая проблема, которую можно решить. Прямо сейчас изменяемое заимствование длится до конца блока, что предотвращает заимствование process во второй раз.

В примере Владимира:

process.stdin.as_mut().unwrap().write_all(input_example);

Заимствование из as_mut никогда не сохраняется в переменной, поэтому оно "выходит из области видимости" сразу после окончания этой строки. Это позволяет вам снова заимствовать его без необходимости в новом прицеле.

person Shepmaster    schedule 21.02.2015

Я не уверен, почему вы решили, что вам здесь нужен явный заем. Следующее работает отлично:

use std::old_io::process::Command;

fn main() {
    let mut process = Command::new("tr")
        .arg("a-z").arg("A-Z")
        .spawn()
        .ok().expect("Failed.");

    let input_example = "hello world".as_bytes();

    process.stdin.as_mut().unwrap().write_all(input_example);

    let output = process.wait_with_output().ok().expect("Failed.");
    println!("Output:");
    println!("{}", String::from_utf8(output.output).unwrap());
}
person Vladimir Matveev    schedule 21.02.2015