[Day4] Rust 闭包以及判断式

话就不多说了,直接开始今天的内容吧

闭包

闭包的别称为「匿名函数」有三个特点

  • 可以像函数一样被呼叫
  • 可以自动判断传入及传回的类型
  • 可以捕捉环境中的自由变数
pub fn closure() {
    let closure_add = |i: i32, j: i32| -> i32{i + j};
    println!("{}", closure_add(1, 5));
}

以上就是最简单的闭包,但是讲的还没有到很完整

let closure_add2 = | i, j | i + j;
println!("{}", closure_add2(7, 8));

如果要省略型式是可以这样写的
他会自动判断传入以及回传形式。
不过,要注意的是

let closure_add2 = | i, j | i + j;
println!("{}", closure_add2(7, 8));
println!("{}", closure_add2(1.5, 5.1));

这样是会编译失败的,因为在第一次使用时就决定了这个闭包的型式。
但是,这不就跟前面所写的函数一样吗。
同样是写在函数中,也可以定义他的型别。

fn init_fn() {
    fn inside(i: i32, j: i32) -> i32 { i + j };
}

这样是可以的,只是说最大的差别在,不能使用外部的变数。
也就是说闭包可以这样写。

pub fn closure() {
    let a = 1000;
    let closure_add1 = |i: i32, j: i32| -> i32{i + j + a};
    println!("{}", closure_add1(1, 5));
    let closure_add2 = | i, j | i + j + a as f64;
    //println!("{}", closure_add2(7, 8));
    println!("{}", closure_add2(1.5, 5.1));
}

而函数这样写则会报错

pub fn init_fn() {
    let a = 5;
    fn inside(i: i32, j: i32) -> i32 { i + j + a };
    println!("{}", inside(5, 6));
}


以上大概就是简单的闭包内容,闭包是以 trait 实现的,但是我也还没介绍到 trait 所以就略过了。
绝对不是我懒的讲


那接下来要讲的就是判别式的部份。
在 Rust 中,能够像 C / C++ 一样使用 if / else
这边就不放在 Github 上了。
因为应该蛮好理解的(我懒了 QQ)

let a = 5;
if a == 5 {
    println!("{}", a);
}
else if(a == 0) {
    println!("{}", a);
}
else {
    println!("NOT FIVE OR ZERO");
}

这边的使用方法蛮简单的
但是 if 判断式其实还可以绑定在变数上。
像是这样

let n = 5;
let a = if n > 5 {
    5
}
else {
    0
};
println!("{}", a);

如果说,这样写起来太过於丑陋,其实 Rust 有跟 C / C++ 中的 switch 差不多的 match
使用方式如下 :

let chk = 5;
match chk {
    0 => println!("IT ZERO"),
    5 => println!("IT FIVE"),
    _ => println!("OTHER"),
}

那在 Rust 中可以使用 @ 来将变数绑定给其他变数 ex:

let chk = 5;
match chk {
    0 => println!("IT ZERO"),
    n @ 5 => println!("{}", n),
    5 => println!("IT FIVE"),
    _ => println!("OTHER"),
}

也可以用 num...num 来构造范围。
也可以用 num | num | num 来构造多选项比对。(讲的有点复杂用 code)
那在 Rust 中可以使用 @ 来将变数绑定给其他变数 ex:

let chk = 5;
match chk {
    0 => println!("IT ZERO"),
    0..10 => println!("IT IN 0..10"),
    n @ 5 => println!("{}", n),
    5 | 3 | 1 => println!("IT FIVE OR 3 OR 1"),
    _ => println!("OTHER"),
}

那今天也写了2000多字了
大概这样 明天介绍啥我还在想 @@ 来个 loop 也不错,顺便几道 Leetcode 吧!
有问题可以提问喔 owo/


9/9
我突然发现我少讲一个点,就是当在使用判断式
如: if else match 时,是不用像 C / C++ 一样外面加一个括号的

if (a == 1){}

C++ 如果是这样 Rust 就能直接省略

if a == 1 {}

总之 大概就这样 半夜突然想到 QQ


<<:  [Day8] 从入门到入狱! 用Python窃听电脑键盘事件!

>>:  零信任原则(Zero Trust principles)

Day 10. slate × 架构蓝图

在开始今天的主题前,虽然在前面介绍 Slate 时已经有稍微提到过了,我们还是先从 slate 的...

Snowflake SnowPro-Core Dumps - The Best Option To Pass Exam

Use Actual Snowflake SnowPro-Core Dumps to Learn F...

机器视觉与影像辨识

第四个范例跟机器视觉与影像辨识有关, 我们先来了解一下什麽是机器视觉. 机器视觉 机器视觉想要做的事...

铁人赛 Day18-- 继续我们的登入者介面吧

前言 来为我们的登入者介面 banner 和 footer 吧!! Banner 我的Banner很...

Day 28 [整理03] JavaScript类数组

甚麽是类数组 先来打造一个很酷的数组 let obj = { '0': 'a', '1': 'b',...