如果我们检查编译器提供的完整错误,这可能有助于阐明:
error: mismatched types:
expected `std::process::Command`,
found `&mut std::process::Command`
(expected struct `std::process::Command`,
found &-ptr) [E0308]
command = command.arg(arg);
^~~~~~~~~~~~~~~~
编译器指向表达式的整个右侧。这表明有问题返回值 of the arg
称呼。让我们看看的文档arg http://doc.rust-lang.org/std/process/struct.Command.html#method.arg:
fn arg<S: AsRef<OsStr>>(&mut self, arg: S) -> &mut Command
So, arg
对可变引用进行操作self
,接受一个arg
参数,以及returns对自身的可变引用。让我们稍微改变一下你的代码来测试我们的假设。我们将使用一个技巧让编译器告诉我们变量的类型 https://stackoverflow.com/q/21747136/155423:
for arg in &args[1..args.len()] {
let _: () = command;
let _: () = command.arg(arg);
}
这会产生错误:
error: mismatched types:
expected `()`,
found `std::process::Command`
let _: () = command;
^~~~~~~
error: mismatched types:
expected `()`,
found `&mut std::process::Command`
let _: () = command.arg(arg);
^~~~~~~~~~~~~~~~
哈,我们明白了!我们正在尝试存储一个&mut Command
转化为类型变量Command
。不会工作!由于构建器模式的此实例会改变构建器,因此我们无需执行任何特殊操作来保留它:
use std::env;
use std::process::Command;
fn main() {
let mut command = Command::new("/usr/bin/x-terminal-emulator");
for arg in env::args().skip(1) {
command.arg(arg);
}
}
还有另一种风格的构建器模式接受self
按值并按值返回它。在这种情况下,你would必须在每个步骤之间跟踪构建器,并且您的代码将按原样运行。