这是在借"Rust way"吗?

Is this kind of borrowing the "Rust way"?

当我尝试启动另一个应用程序时,在它的标准输入上写一些东西然后等待它完成,我的代码看起来像这样 (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",我需要确保它在再次访问之前超出范围,不是吗?另一个问题是:为什么它需要借 "process" 呢?

我不确定你为什么决定在这里需要明确借用。以下完美运行:

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());
}

Why does it need to borrow "process" at all?"

因为您正在使用 Option::as_mut。签名看起来像:

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

这表示 return 值的生命周期与输入相关联。此外,它是一个可变引用,您只能在特定时间拥有一个(以防止 别名)。

您需要添加新范围的原因是 borrow scopes are lexically-scoped。这被认为是一个烦人但可以解决的问题。现在,可变借用一直持续到块的末尾,这防止了第二次借用 process

在弗拉基米尔的例子中:

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

as_mut 借用的内容永远不会存储在变量中,因此它会在该行结束后立即 "goes out of scope" 。这允许您再次借用它而无需新的范围。