铁锈找出闭包注释/签名



问题:

如何找到闭包的签名?具体来说,我如何判断闭包是否引用了我的局部变量?

背景:

我认为pool.install中使用的闭包应该对我的局部变量book进行不可变的引用,但编译器并没有抱怨。因此,我试图找出pool.install中使用的闭包签名,认为这些信息可能有助于我了解发生了什么。

let pool = rayon::ThreadPoolBuilder::new().build().unwrap();
loop {
let book = get_book.select_next_some().await;
while mut_tasks.is_empty() {
select! {
task = rx_grammar_req.select_next_some() => {
match task.req {
Req::M {..} => mut_tasks.push(ready(task)),
Req::R {..} => {
// Q: how do I figure out the closure's signature?
pool.install(|| run_ref_task(&book, task));
}
};
},
}
}
get_book.push(ready(book));
let mut queries = FuturesUnordered::new();
loop {
select! {
book = queries.select_next_some() => {
get_book.push(ready(book));
if mut_tasks.is_empty() && queries.is_empty() { break; }
},
book = get_book.select_next_some() => {
if let Some(task) = mut_tasks.next().await {
queries.push(run_mut_task(book, task));
} else {
get_book.push(ready(book));
if queries.is_empty() { break; }
}
}
}
}
}

闭包的签名由ThreadPool::install:的函数签名决定

pub fn install<OP, R>(&self, op: OP) -> R
where
OP: FnOnce() -> R + Send,
R: Send { ... }

因此,闭包的签名是() -> R,其中Rrun_ref_task(&book, task)的输出。

我假设您实际上对闭包的签名不感兴趣,而是对闭包捕获的感兴趣。在这种情况下,book是通过引用捕获的,而task是通过值捕获的,或者如果其类型实现Copy,则进行复制。

关于闭包捕获模式和FnOnce/FnMut/Fn的进一步阅读可以在这里找到:

https://doc.rust-lang.org/reference/types/closure.html#capture-模式https://doc.rust-lang.org/reference/types/closure.html#call-特征和胁迫

最新更新