我的理解是我是否具有以下功能:
fn f(x: Vec<u32>) -> (some result)
f
拥有x
的所有权。 f
现在负责x
的销毁。
如果是这种情况,我可以对x
进行突变吗?要使可变迭代器迭代到x
,需要一个&mut
,我没有。
我应该能够对一个我现在拥有所有权的变量进行突变,而不会产生任何不良影响,这似乎是合理的。调用函数已将x
的所有权转让给f
,因此它不必关心会发生什么。
也许我可以将类型f
更改为f(x: &mut Vec<u32>)
,但是出于各种原因,我并不是很想这样做,例如,它以自然的方式阻止了诸如{{ 1}},并且如果我的“(某些结果)”不是f(g(x))
(例如包含Vec<u32>
的类型),那么我就必须将函数拆分为两个并确保呼叫者会执行他们应做的事情。
答案 0 :(得分:3)
您应将x
参数声明为可变的:mut x: Whatever
fn main() {
let x = vec![];
mutate(x);
}
fn mutate(mut x: Vec<u32>) {
x.push(1);
}
答案 1 :(得分:2)
您可以遮盖x
:
fn main() {
let x = vec![];
mutate(x);
}
fn mutate(x: Vec<u32>) {
let mut x = x;
// ...
}