«

Rust - 闭包

ljierui 发布于 阅读:108 技术杂谈


1.1 什么是闭包

多个参数
|param1, param2,...| {
    语句1;
    语句2;
    返回表达式
}
只有一个参数
|param1| 返回表达式

fn main() {
    // 定义一个闭包
    let x = 10;
    let target = |y:i32|{x+1};
    println!("{}",target(2));
}

2、练习

// 正常使用函数
use std::thread;
use std::time::Duration;

fn muuu(yd:u32) -> u32{
    print!("哈斯~哈斯~\n");
    // 停2秒
    thread::sleep(Duration::from_secs(2));
    yd
}

fn workout(yd:u32,qd:u32){
    if yd < 15{
        print!("今天活力满满,运动一下,做{}个俯卧撑\n",muuu(yd));
        print!("不够,继续,在来{}个卧推\n",muuu(yd));
    }else if qd == 3 {
        println!("今天强度够了");
    }else {
        print!("好累,不想练,泡{}分钟澡",muuu(yd));
    }

}

fn main() {
    // 强度
    let intensity = 10;
    // 随机值用来决定某个选择
    let random_number = 7;
    // 开始
    workout(intensity, random_number);
}

2.1、通过闭包修改

use std::thread;
use std::time::Duration;

fn workout(yd:u32,qd:u32){
    let muu = ||{
        print!("哈斯~哈斯~\n");
        // 停2秒
        thread::sleep(Duration::from_secs(2));
        yd
    };

    if yd < 15{
        print!("今天活力满满,运动一下,做{}个俯卧撑\n",muu());
        print!("不够,继续,在来{}个卧推\n",muu());
    }else if qd == 3 {
        println!("今天强度够了");
    }else {
        print!("好累,不想练,泡{}分钟澡",muu());
    }

}

fn main() {
    // 强度
    let intensity = 10;
    // 随机值用来决定某个选择
    let random_number = 7;
    // 开始
    workout(intensity, random_number);
}

3、闭包的类型推倒

fn main(){
    let exp = |x|x;
    let str_test = exp(String::from("hello"));
    // 下面的会报错,因为编译推断不出来类型是什么
    let num_test = exp(54);
}

4、结构体中的闭包

4.1、如果让Struct持有闭包

4.2、Fn Trait

4.3、代码

// 定义结构体存储数据
struct yundong_shuju<T>
    where T : Fn(u32) -> u32{
        action:T,
        value:Option<u32>
    }

// 实现结构体
impl<T> yundong_shuju<T> 
where T : Fn(u32) -> u32 {
    // 实现构造方法
    fn new(action:T) ->yundong_shuju<T> {
        yundong_shuju{
            action,
            value:None,
        }
    }
    // 实现查询方法
    fn value(&mut self,arg:u32) ->u32{
        match self.value {
            Some(v) => v,
            None =>{
                let v = (self.action)(arg);
                v
            }
        }
    }
}

4.4、move关键字

rust语言学习

推荐阅读: