Rust中的函数是第一类对象吗?

Sho*_*ara 13 rust

函数可以作为参数传递吗?例如,在JavaScript中,您可以将函数作为参数传递,如下所示:

setInterval(function() { /*...*/ }, 1000);
Run Code Online (Sandbox Code Playgroud)

PEP*_*EPP 9

他们是一流的.与JavaScript相比,Rust有两种类型 - 函数和闭包.

fn first_class() {
    println!("function");
}

fn higher_kinded<F: FnOnce()>(cb: F) {
    cb();
}

fn main() {
    higher_kinded(first_class); // passing function
    higher_kinded(|| println!("closure")); // passing closure
}
Run Code Online (Sandbox Code Playgroud)


Nat*_*ate 9

function() {}Rust中存在像JavaScript中的匿名函数,您可以使用闭包语法来定义它们

|arg, arg2, arg3| {
  /* function body including optionally closed-over variables */
} 
Run Code Online (Sandbox Code Playgroud)

请注意,参数和返回类型是推断的!

无论他们是否是头等舱,都需要更多的探索.默认情况下,函数会借用已关闭的变量.您可以使用move闭包指定将这些值移动到函数中:

let num = 5;
let plus_num = move |x: i32| x + num;
Run Code Online (Sandbox Code Playgroud)

重要的是,不引用其环境(包括move闭包)的闭包不需要引用创建它们的堆栈帧.由于它们的尺寸未知,因此它们本身不是一流的物体.

你可以Box封闭,并返回它作为一个特性对象Fn特质.

本文简要回答了本书的内容,该内容解释了封闭装置是如何脱落以及它们如何与环境相互作用的.