Rust-定义Closure(闭包)

一般来说Rust如果要排序数组会这样写

let mut arr = [10, 5, 9, 7, 6]

arr.sort();

println!("{:?}", arr);

输出
[5, 6, 7, 9, 10]

刚刚升序如果要降序就必须使用sort_by 需要自己写函式来传给sort_by排序决定用

let mut arr = [10, 5, 9, 7, 6]

use std::cmp::Ordering;

fn descFn(a: &i32, b: &i32) -> Ordering {
    if  a < b {
        return Ordering::Greater;
    } else if a > b  {
        return Ordering::Less
    } else {
        return Ordering::Equal
    }
}

arr.sort_by(descFn);

println!("{:?}", arr);

输出
[10, 9, 7, 6, 5]

造上面这样使用有个缺点就是必须在宣告一个函式,如果只用一次的话就可用更简短的使用匿名函式

let mut arr = [10, 5, 9, 7, 6]

use std::cmp::Ordering;

arr.sort_by(|a: &i32, b: &i32|
    if  a < b {
        return Ordering::Greater;
    } else if a > b  {
        return Ordering::Less
    } else {
        return Ordering::Equal
    }
);

println!("{:?}", arr);
输出
[10, 9, 7, 6, 5]

使用一个匿名函式就可以简短许多不用再宣告新的函式

Rust跟一般语言的匿名函式有个特别的限制就是无法使用外部宣告的变数

例如这样是不合法的

let outVal = 10;

fn printOutVal() {
    println!("{}", outVal); // 无法访问outVal变数
}

printOutVal();

// 编译时会出现错误

但是使用静态变数或是常量例如

const CONSTVAL: i32 = 10;

fn printOutVal() {
    println!("{}", CONSTVAL); // 合法使用
}

printOutVal();

-----------------------------

static STATICVAL: i32 = 0;

fn printOutVal() {
    println!("{}", CONSTVAL); // 合法使用
}

printOutVal();

Rust这样限制应该基於所有权的设计关系,这样有个好处就是避免乱引用变数造成BUG也比较好阅读

当然Closure有更多复杂的使用这边只简单介绍最基本的使用方法


<<:  D21 - 用 Swift 和公开资讯,打造投资理财的 Apps { 台股成交量实作.1 }

>>:  [面试][後端]设计 API 时会考虑哪些点?

Day 22 中断的运用

在Day 20有稍微提到中断机制,我们稍微深入说明一下,中断其实也是种不浪费资源的方式,如果处理器一...

何谓架构(Architecture)?

架构是解决方案最重要的工件,它是从各种观点或角度看一个东西(即解决方案)所产生的概念、逻辑和物理呈...

【day17】 时间格式 X 搜寻结果排序

今天我们要新增一个搜寻排序的功能! 还记得我们之前把从datePicker拿到的资料转成Strin...

Day 19:专案03 - PTT 八卦版爬虫04 | 留言、换页、json

各位早阿,今天就接续昨天的部分,继续抓取留言和汇出成json档吧! 留言区 观察一下PTT的留言区,...

[Day6] 词性标注(一)-前言

一. 前言 词性标注 Part Of Speech(後面皆简称POS),简单来说就是将文章、句子中,...