由於可以將可變引用傳遞給一個向量(不會引起移動),因此可以多次將Option<reference>
函數傳遞給函數,而不會導致借用檢查錯誤?如何將`Option <&mut ...>`傳遞給多個函數調用而不會導致移動錯誤?
這個簡單的例子只是顯示了當Option<&mut Vec<usize>>
傳遞多次到功能會發生什麼:
fn maybe_push(mut v_option: Option<&mut Vec<usize>>) -> usize {
let mut c = 0;
if let Some(ref mut v) = v_option.as_mut() {
for i in 0..10 {
v.push(i);
c += i;
}
}
return c;
}
fn maybe_push_multi(v_option: Option<&mut Vec<usize>>) -> usize {
let mut c = 0;
c += maybe_push(v_option);
c += maybe_push(v_option);
c += maybe_push(None);
return c;
}
fn main() {
let mut v: Vec<usize> = vec![];
let v_option = Some(&mut v);
println!("{}", maybe_push_multi(v_option));
}
給出了錯誤:
error[E0382]: use of moved value: `v_option`
--> <anon>:17:21
|
16 | c += maybe_push(v_option);
| -------- value moved here
17 | c += maybe_push(v_option);
| ^^^^^^^^ value used here after move
|
= note: move occurs because `v_option` has type `std::option::Option<&mut std::vec::Vec<usize>>`, which does not implement the `Copy` trait
好知道作爲替代現有的答案。雖然有效,但這使得在多次向函數傳遞參數時使用它變得很煩人。我試圖將'opt.as_mut()。map(| x |&mut ** x)'放入宏中。 – ideasman42