我这样说明它:
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);
它实际上会复制数据。如果不Copy
T
那么这些甚至都不起作用,因为值会被移动,所以你以后甚至无法打印它。
如果将其作为可变引用传递,则该函数可以更改原始值:
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);
}
游乐场链接