Rust 匿名函数(lambda)笔记

匿名函数源于函数式编程 Lisp,可用于捕获外部变量、进行函数式的 list 操作等,rust 借鉴了这一点,语法上则与 Ruby 较为接近。

基本声明

let square = |x| {
    x * x
};
let print_me = || println!("rust is fun");

捕获外部变量

let x = 2;
let another_square = || x * x;

// call another_square
another_square()    // -> 4

作为函数参数

fn run(fun: F, x: i32) -> i32
    where F: Fn(i32) -> i32 {
    fun(x)
}

// call square
run(square, 2)      // -> 4

作为返回值

fn return_square() -> Box<Fn(i32) -> i32> {
    Box::new(move |x| x * x)
}

// call square
return_square()(2)  // -> 4

函数式 list 操作

let v = vec![1, 2, 3];

v.iter().any(|&x| x != 2)  // -> true

let var: u32 = (0..).map(|n| n * n)
                    .take_while(|&n| n < 100)
                    .filter(|&n| n % 2 == 0)
                    .fold(0, |var, i| var + i);
var // -> 120

匿名函数也叫做闭包,Mozilla 解释 JavaScript 的“闭包”为 “闭包是函数和声明该函数的词法环境的组合”,rust 也是类似的。即闭包是需要结合上下文环境使用的,在 rust 中,闭包不需要声明变量类型,因为其设计目的并不是暴露给外部调用,其采用自动类型推断,为 rust 中的函数式编程部分服务。

参考:

  1. TRPL – Closures

作者: YanWen

Web 开发者

发表评论

Fill in your details below or click an icon to log in:

WordPress.com 徽标

You are commenting using your WordPress.com account. Log Out /  更改 )

Google photo

You are commenting using your Google account. Log Out /  更改 )

Twitter picture

You are commenting using your Twitter account. Log Out /  更改 )

Facebook photo

You are commenting using your Facebook account. Log Out /  更改 )

Connecting to %s