如何防止在<T>重新分配选项时移动它?



我有以下代码:

use std::env;
use std::fs;
use std::fs::File;
use std::fs::OpenOptions;
use std::io::stdin;
use std::io::stdout;
use std::io::ErrorKind;
use std::io::Write;
use std::io::{self, prelude::*, BufReader};
use std::path::Path;
use std::process::Child;
use std::process::Command;
use std::process::Stdio;
use std::str;
fn process_line(input: &str) -> String {
let mut commands = input.trim().split(" | ").peekable();
let mut previous_command = None;
let mut resultat = String::new();
while let Some(command) = commands.next() {
let mut parts = command.trim().split_whitespace();
let mut command = parts.next().unwrap();
let args = parts;
match command {
//[...]
command => {
if commands.peek().is_some() {
let stdin = match previous_command {
None => Stdio::inherit(),
Some(o) => o,
};
let stdout = Stdio::piped();
let output = Command::new(command)
.args(args)
.stdout(stdout)
.stdin(stdin)
.spawn();
match output {
Ok(o) => previous_command = Some(Stdio::from(o.stdout.unwrap())),
Err(e) => {
previous_command = None;
eprintln!(" Err: {}", e);
}
};
} else {
let stdin = match previous_command {
None => Stdio::inherit(),
Some(o) => o,
};
let output = Command::new(command)
.args(args)
.stdin(previous_command.unwrap())
.output()
.expect("???");
&mut resultat.push_str(
str::from_utf8(&output.stdout).expect("Could not convert command to str"),
);
}
}
};
}
return resultat;
}

目标是获取一个包含shell命令的字符串,该命令可能包含或不包含管道,执行它们并返回结果。

我在管道的情况下使用previous_command来存储前一个命令的输出并重用它;然而,我似乎无法重新分配它而不以使用移动的value":

结束
error[E0382]: use of moved value
--> src/lib.rs:59:34
|
30 |         let mut previous_command = None;
|             -------------------- move occurs because `previous_command` has type `Option<Stdio>`, which does not implement the `Copy` trait
...
59 |                             Some(o) => o,
|                                  ^ value used here after move
...
83 |                             .stdin(previous_command.unwrap())
|                                                     -------- `previous_command` moved due to this method call, in previous iteration of loop

我已经尝试使用as_mut()重新分配值,但无济于事…任何想法?

我已经尝试使用as_mut(),如:

Ok(o) => previous_command.as_mut() = &mut Some(Stdio::from(o.stdout.unwrap())),

但是最后有"cannot assign to this expression"

还尝试将其包装在一个向量中,但无法管理。

你可以看到,除了在循环的最后一次迭代中,每次previous_command从它移动时,它也会后退;但是编译器不能区分最后一次迭代和以前的迭代,并且它抱怨你可能在前一次迭代中被else移动后输入if

修复很简单:只是为了让编译器高兴,在else块的末尾分配previous_command = None;

这将显示另一个(不相关的)借用错误,但它很容易解决。我把它留给你作为练习:)

最新更新