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 根据它的文档在常规函数和闭包之间产生了很大的差异.
作为一个库作者,我是否总是必须使这些方法接受闭包而不是常规函数,以免过多限制库用户?
在我看来,闭包是写匿名函数的唯一方法,还是我错了?
目前,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闭包是编写匿名函数的唯一两种方法.
| 归档时间: |
|
| 查看次数: |
289 次 |
| 最近记录: |