首页 > 其他 > 详细

FnOnce和move关键字

时间:2020-05-29 15:40:28      阅读:54      评论:0      收藏:0      [点我收藏+]

move关键字是强制让环境变量的所有权转移到闭包中而不管是不是发生了所有权的转移

move关键字和匿名函数是否是FnOnce没有必然联系,之和匿名函数体有关

当匿名函数体里转移了环境变量的所有权的时候,匿名函数就是FnOnce。

当匿名函数体里改变了环境变量的值的时候,匿名函数就是FnMut。

否则匿名函数就是Fn。

关于move修饰的匿名函数需要注意的2点

1.如果函数不是FnOnce,此匿名函数可以重复调用

    let mut x = vec![1];
    let mut incr_x = move || {
        println!("{:?}", x);
        x.push(1);
    };
    incr_x();
    incr_x();
    incr_x();

2.如果捕获变量是复制语义类型,则闭包会实现Copy/Clone。如果捕获变量是移动语义类型,则闭包不会实现Copy/Clone。普通闭包都是移动语义

fn call<F: FnOnce()>(f: F) { f() }

fn main() {
    //未使用 move
    let mut x = 0;
    let incr_x = || x += 1;
    call(incr_x);
    // call(incr_x); // ERROR: ‘incr_x‘ moved in the call above.
    //使用 move
    let mut x = 0;
    let incr_x = move || x += 1;
    call(incr_x);
    call(incr_x);
    //对移动语义类型使用move
    let mut x = vec![];
    let expend_x = move || x.push(42);
    call(expend_x);
    // call(expend_x); //ERROR: use of moved value: ‘expend_x‘
}

 

FnOnce和move关键字

原文:https://www.cnblogs.com/chen8840/p/12987512.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!