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

Dom*_*kis 0 mutability move-semantics rust

我这样说明了一下:

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

}
Run Code Online (Sandbox Code Playgroud)

Rust Playground链接

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

Pet*_*all 5

T: Copy那么这样的Option<T>.这意味着,当您将其作为函数参数传递时:

take_inner(opt2);
Run Code Online (Sandbox Code Playgroud)

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

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

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

take_inner(&mut opt2);
Run Code Online (Sandbox Code Playgroud)