为什么Rust中的闭包和函数之间的巨大差异以及如何解决它?

Chr*_*oph 2 closures function rust

我刚遇到Rust处理闭包的问题.

让我们假设我是一名图书馆作者,并编写了这种方法

fn get(&mut self, handler: fn() -> &str){
    //do something with handler
}
Run Code Online (Sandbox Code Playgroud)

现在,如果用户想要像这样调用此方法

let foo = "str";
server.get(|| -> &str { foo });
Run Code Online (Sandbox Code Playgroud)

它不会起作用,因为Rust 根据它的文档在常规函数和闭包之间产生了很大的差异.

作为一个库作者,我是否总是必须使这些方法接受闭包而不是常规函数,以免过多限制库用户

在我看来,闭包是写匿名函数的唯一方法,还是我错了?

Bur*_*hi5 5

目前,fn()类型可以自动"提升"为||类型.(我想是一个空环境的闭包.)例如,这有效:

fn get(handler: || -> &str) -> &str {
    handler()
}

fn main() {
    fn handler_fn() -> &str { "handler_fn" }
    let handler_cl = || -> &str "handler_cl";
    println!("{}", get(handler_fn));
    println!("{}", get(handler_cl));
}
Run Code Online (Sandbox Code Playgroud)

因此,如果您的库函数get不关心是否handler是闭包,那么接受闭包以获得最大的灵活性似乎是合理的.但这并不总是可行的.例如,如果你想handler在另一个任务中执行,那么我认为它必须是一个fn或一个proc类型.(我不是100%肯定的 - 我可能会错过一个细节.)

关于匿名函数,是的,一个||或一个proc闭包是编写匿名函数的唯一两种方法.