zoukankan      html  css  js  c++  java
  • 【Rust】闭包捕获变量

    环境

    • Rust 1.56.1
    • VSCode 1.61.2

    概念

    参考:https://doc.rust-lang.org/stable/rust-by-example/fn/closures/capture.html

    示例

    捕获引用

    fn main() {
        let color = String::from("green");
    
        // 闭包借用 color 变量
        let print = || println!("`color`: {}", color);
        print();
    
        // 可以再次不可变借用,因为闭包只捕获了不可用引用。
        let _reborrow = &color;
        print();
    
        // 闭包使用完成后,变量可以进行移动。
        let _color_moved = color;
    }
    

    捕获可变引用

    fn main() {
        let mut count = 0;
        // 闭包需要使用 mut,因为里面有 mut count。
        let mut inc = || {
            count += 1;
            println!("`count`: {}", count);
        };
    
        inc();
        inc();
    
        // 因为上面的可变借用完了,所以这里可以再次使用可变借用
        let _count_reborrowed = &mut count;
    }
    

    捕获值

    fn main() {
        let haystack = vec![1, 2, 3];
        // haystack 移动到了闭包里
        let contains = move |needle| haystack.contains(needle);
    
        println!("{}", contains(&1));
        println!("{}", contains(&4));
    
        // 上面已经发生了移动,所以这里不能再次使用了
        // println!("There're {} elements in vec", haystack.len());
    }
    

    只能调用一次的移动

    fn main() {
        use std::mem;
    
        let movable = Box::new(3);
        let consume = || {
            println!("`movable`: {:?}", movable);
            mem::drop(movable);
        };
    
        consume();
        // 编译错误,只能调用一次
        // consume();
    }
    

    总结

    了解了 Rust 中的闭包捕获变量的几种方式。

    附录

  • 相关阅读:
    【计算机网络】复习集(更新中)
    滑雪 (记忆化搜索)
    橱窗布置
    复制书稿 (dp+贪心)
    8786:方格取数 (多线程dp)
    编辑距离
    8782:乘积最大
    合并石子 (区间dp+前缀和)
    6045:开餐馆
    6049:买书 (完全背包)
  • 原文地址:https://www.cnblogs.com/jiangbo44/p/15630684.html
Copyright © 2011-2022 走看看