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

时间:2014-05-25 19:42:23

标签: function closures rust

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

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

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

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

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

它不起作用,因为Rust,according to it's documentation在常规函数和闭包之间产生了很大的差异。

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

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

1 个答案:

答案 0 :(得分: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));
}

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

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