为什么在Rust中闭包和函数之间有如此显著的区别,以及如何解决这个问题?

4

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

假设我是一个库的作者,我写了这个方法:

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

现在,如果用户想这样调用该方法
let foo = "str";
server.get(|| -> &str { foo });

这样做行不通,因为 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,那么我认为它必须是 fnproc 类型。(我不确定百分之百——我可能错过了一些细节。)

关于匿名函数,是的,||proc 闭包是编写匿名函数的唯二方式。


好的,看起来闭包确实是正确的选择。然而,这为我打开了潘多拉盒子。你可能想看一下我的下一个问题;-) https://dev59.com/sYDaa4cB1Zd3GeqP-wUN - Christoph

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接