问题:
如何找到闭包的签名?具体来说,我如何判断闭包是否引用了我的局部变量?
背景:
我认为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
,其中R
是run_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-特征和胁迫