我刚刚遇到了 Rust 如何处理闭包的问题。
假设我是一个库作者并且编写了这个方法
fn get(&mut self, handler: fn() -> &str){
//do something with handler
}
现在如果用户想像这样调用这个方法
let foo = "str";
server.get(|| -> &str { foo });
它不会工作,因为 Rust,根据它的文档在常规函数和闭包之间有很大的区别。
作为库作者,我是否总是必须让此类方法接受闭包而不是常规函数,以免过多限制库用户?
在我看来,闭包似乎是编写 anonymous 函数的唯一方法,还是我错了?
目前,
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));
}
因此,如果您的库函数
get
不关心 handler
是否是闭包,那么只接受闭包以获得最大灵活性似乎是合理的。但这并不总是可能的。例如,如果你想在另一个任务中执行handler
,那么我相信它必须是fn
或proc
类型。 (我在这里不是 100% 确定——我可能遗漏了一个细节。)
关于匿名函数,是的,
||
或proc
闭包是编写匿名函数的唯一两种方法。