【问题标题】:rust find out closure annotation / signaturerust 找出闭包注释/签名
【发布时间】:2021-04-27 02:54:21
【问题描述】:

问题:

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

背景:

我认为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; }
                    }
                }
            }
        }
    }

【问题讨论】:

    标签: rust closures


    【解决方案1】:

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

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

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

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

    更多关于闭包捕获模式和FnOnce/FnMut/Fn的信息可以在这里找到:

    https://doc.rust-lang.org/reference/types/closure.html#capture-modes https://doc.rust-lang.org/reference/types/closure.html#call-traits-and-coercions

    【讨论】:

      猜你喜欢
      • 2021-08-24
      • 2021-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-17
      • 1970-01-01
      • 2022-12-01
      • 1970-01-01
      相关资源
      最近更新 更多