以下是琐碎的复制(截至2月2日至23日,每晚Rust ):

fn main() {
    let closure = |_v| {};
    // this one works fine
    // let closure = |_v: &_| {};
    {
        let x = 1;
        closure(&x);
    }
    {
        let y = 1;
        closure(&y);
    }
}

错误是:

6  |         let x = 1;
   |             - binding `x` declared here
7  |         closure(&x);
   |                 ^^ borrowed value does not live long enough
8  |     }
   |     - `x` dropped here while still borrowed
...
11 |         closure(&y);
   |         ------- borrow later used here

这没有意义,因为closure没有捕获变量x,而只是一个通过引用传递的参数.

为闭包参数_v: &_提供显式引用解决了这个问题,但它不应该被自动推断吗?

是借阅判断器的某些缺陷/限制吗?或者我遗漏了一些更基本的东西?

推荐答案

对我来说,这看起来可能是一个类型推断的错误.

我认为正在发生的事情是

fn main() {
    let closure = |_v| {};

    { 
        let x = 1; // Lifetime `a begins
        closure(&x); // closure is inferred to be fn(&'a i32)
        // Lifetime 'a end
    }
    {
        let y = 1; // Lifetime `b begins
        closure(&y); // attempt to call closure fn(&'a i32) with &'b i32
        // Lifetime 'b end
    }
}

但将闭合定义为

let closure = |_v: &'_ i32| {};

停止编译推断其生存期,并按应使用hrtb.

Rust相关问答推荐

通用池类型xsx

包含嵌套 struct 的CSV

是否可以为`T:Copy`执行`T. clone`的测试

带参考文献的 rust 元组解构

Rust移动/复制涉及实际复制时进行检测

为什么HashMap::get和HashMap::entry使用不同类型的密钥?

RUST 中的读写器锁定模式

Rust 中的内存管理

中文优化标题:跳出特定循环并返回一个值

Rust Serde 为 Option:: 创建反序列化器

无法理解 Rust 对临时值的不可变和可变引用是如何被删除的

如何将 Rust 中的树状 struct 展平为 Vec<&mut ...>?

当 T 不是副本时,为什么取消引用 Box 不会抱怨移出共享引用?

仅当满足外部条件时如何添加到 actix web 的路由

`map` 调用在这里有什么用吗?

当我不满足特征界限时会发生什么?

为什么 Rust 编译器在移动不可变值时执行复制?

在 Rust 中为泛型 struct 编写一次特征绑定

提取 struct 生成宏中字段出现的索引

Rust 中的运行时插件