代码之家  ›  专栏  ›  技术社区  ›  Dominykas Mostauskis

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

  •  0
  • Dominykas Mostauskis  · 技术社区  · 7 年前

    我这样解释:

    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)"
    
    }
    

    Rust Playground link

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

    2 回复  |  直到 7 年前
        1
  •  4
  •   Shepmaster Tim Diekmann    7 年前

    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);
    }
    

    Playground link

        2
  •  5
  •   Peter Hall    7 年前

    什么时候? T: Copy 那也是 Option<T> . 这意味着,当您将其作为函数参数传递时:

    take_inner(opt2);
    

    它实际上会复制数据。如果 T 不是 Copy 移动

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