1

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

4

2 回答 2

3

为什么它需要借用“过程”呢?”

因为你正在使用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永远不会存储在变量中,因此它会在该行结束后立即“超出范围”。这允许您再次借用它而无需新的范围。

于 2015-02-21T17:46:41.327 回答
1

我不确定你为什么决定在这里显式借用。以下工作完美:

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());
}
于 2015-02-21T17:31:00.410 回答