为什么在函数内部改变传递的选项不会传播到外部的选项?
Why does mutating a passed Option inside a function not propagate to the Option outside?
我是这样说明的:
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);
它实际上会复制数据。如果 T
不是 Copy
那么其中的 none 甚至可以工作,因为该值将改为 moved,所以您以后甚至无法打印它.
如果将其作为可变引用传递,则该函数可以更改原始值:
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);
}
我是这样说明的:
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);
它实际上会复制数据。如果 T
不是 Copy
那么其中的 none 甚至可以工作,因为该值将改为 moved,所以您以后甚至无法打印它.
如果将其作为可变引用传递,则该函数可以更改原始值:
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);
}