为什么在函数内改变传递的选项不会传播到外部的选项?



我这样说明它:

fn main() {
let mut opt1 = Some(1);
// compiler complains that opt2 doesn't have to be mutable
let mut opt2 = Some(1);
fn take_inner(mut opt: Option<u8>) {
opt.take();
};
opt1.take();
take_inner(opt2);
println!("opt1 {:?}", opt1); // prints "opt1 None"
println!("opt2 {:?}", opt2); // prints "opt2 Some(1)"
}

锈游乐场链接

为什么在函数内调用opt.take()与在函数外调用函数的效果不同(相对于主函数的作用域(?

T: Copy时,Option<T>也是如此。这意味着,当您将其作为函数参数传递时:

take_inner(opt2);

它实际上会复制数据。如果不CopyT那么这些甚至都不起作用,因为值会被移动,所以你以后甚至无法打印它。

如果将其作为可变引用传递,则该函数可以更改原始值:

fn take_inner(opt: &mut Option<u8>) {
opt.take();
};
take_inner(&mut opt2);

因为u8是复制类型,而Option

impl<T> Copy for Option<T>
where
T: Copy,

take_inner拿了一份opt2

您可以通过采用可变引用来解决此问题:

fn main() {
let mut opt1 = Some(1);
// compiler complains that opt2 doesn't have to be mutable
let mut opt2 = Some(1);
fn take_inner(opt: &mut Option<u8>) {
opt.take();
};
opt1.take();
take_inner(&mut opt2);
println!("opt1 {:?}", opt1);
println!("opt2 {:?}", opt2);
}

游乐场链接

最新更新