Rust Closure

Rust 闭包

内存中的样子(直接搬运Claude的回答)

Rust中的闭包在内存中的表示方式:

  1. 使用结构体来保存闭包所捕获的环境。这个结构体包含了闭包捕获的所有变量的拷贝。
  2. 闭包是一个trait(通常是Fn, FnMut或FnOnce),这个trait定义了调用闭包的方法。
  3. 一个包含闭包代码的匿名函数,这个函数接收一个captured结构体作为参数,在函数体内可以访问 captured 中的变量。
  4. 一个enum,variantsSaving包含上面定义的结构体和函数。

举个例子:

1
2
3
let x = 10;

let print_x = || println!("{}", x);

它在内存中的表示类似:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
struct PrintXCaptured {
x: i32
}

impl Fn() for PrintX {
fn call(&self) {
let PrintXCaptured { x } = self;
println!("{}", x);
}
}

enum PrintX {
Saving {
env: PrintXCaptured,
func: fn(PrintXCaptured),
}
}

所以闭包在内存中保存了它捕获的环境,并具有调用其代码的功能。这使得闭包可以在不同的上下文中传递。