是什么使得在 Rust 中需要函数指针类型的地方可以使用闭包类型?

Max*_*ber 5 closures rust

是什么使得可以在使用函数指针类型的地方使用闭包类型?

fn takes_ptr(_f: fn(u32) -> u32) {}


fn main() {
    let closure = |n| n;
    takes_ptr(closure)
}
Run Code Online (Sandbox Code Playgroud)

相关:还有另一个问题询问什么使指针类型能够在需要闭包类型的地方使用:什么使函数特征类型能够在需要 fn 类型的地方使用?

loo*_*ops 6

如果闭包不捕获任何局部变量,则可以将其强制为函数指针。

不捕获任何变量的闭包实际上与普通函数相同,这听起来很像。此行为在RFC 1558中定义,其中表示:

不移动、借用或以其他方式访问(捕获)局部变量的闭包应该可强制转换为函数指针 ( fn)。

因此|n| n可以被强制,因为它不捕获任何局部变量,但不能被强制,因为它从外部环境|n| n + a捕获变量。a