Rust 无法推断闭包中的类型

Rust cannot infer type in closure

提问人:Roy Varon 提问时间:10/3/2023 更新时间:10/3/2023 访问量:39

问:

请考虑以下代码:

fn main() {
    let v: Vec<f32> = vec![0.0];
    let foo_a: f32 = (|i| v[i])(0); // This works

    let v: Vec<(f32, f32)> = vec![(0.0, 0.0)];
    let foo_b: f32 = (|i| v[i].0)(0); // This doesn't work

    let foo_c: f32 = (|i| v[i as usize].0)(0); // This works
}

foo_a和 pass 编译,但是会产生错误。出于某种原因,当您尝试索引非基元事物的向量时,在闭包中,编译器无法推断您尝试索引的事物的类型。foo_cfoo_bv[i]

错误:

error[E0282]: type annotations needed
 --> src/main.rs:6:27
  |
6 |     let foo_b: f32 = (|i| v[i].0)(0); // This doesn't work
  |                           ^^^^ cannot infer type

请注意,如果不使用闭包,或者手动指定 的类型,或者使用向量/基元切片,则错误将消失。i

有什么特别之处不允许编译器推断?foo_bv[i]

Rust Closures 类型推断

评论

1赞 Chayim Friedman 10/3/2023
闭包类型推理很古怪。当闭包被传递到函数中并且我们知道它期望的类型时,它的效果最好(这是最常见的情况,所以这是 Rust 编译器优化的情况)。其他情况有时有效,有时无效。不过,我不知道确切的细节。
0赞 Roy Varon 10/3/2023
@ChayimFriedman我想这是有道理的......不过,这完全让我感到惊讶。如果这只是闭包类型推断系统的限制,我可以接受。
0赞 BallpointBen 10/3/2023
奇怪,甚至不起作用。推理确实是一头奇怪的野兽。(|i| v[i].0)(0_usize)
0赞 V0ldek 10/4/2023
通话也不起作用。但是,我不确定这个问题的答案会让您满意。您可以在 github.com/rust-lang/rust 中将此作为问题报告。我们 SO 如何帮助您?get(i)

答: 暂无答案