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

问题描述 投票:0回答:1

我刚刚遇到了 Rust 如何处理闭包的问题。

假设我是一个库作者并且编写了这个方法

fn get(&mut self, handler: fn() -> &str){
    //do something with handler
}

现在如果用户想像这样调用这个方法

let foo = "str";
server.get(|| -> &str { foo });

它不会工作,因为 Rust,根据它的文档在常规函数和闭包之间有很大的区别。

作为库作者,我是否总是必须让此类方法接受闭包而不是常规函数,以免过多限制库用户

在我看来,闭包似乎是编写 anonymous 函数的唯一方法,还是我错了?

function closures rust
1个回答
8
投票

目前,

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
闭包是编写匿名函数的唯一两种方法。

© www.soinside.com 2019 - 2024. All rights reserved.