[fn] 与 [(fn, u8)] 之间的 Rust 差异

20 type-inference rust

为什么会这样编译:

fn main() {
   let xs = [||1, ||2, ||3];
}
Run Code Online (Sandbox Code Playgroud)

但这

fn main() {
   let xs = [(||1, 1), (||2, 2), (||3, 3)] ;
}
Run Code Online (Sandbox Code Playgroud)

编辑:要明确的是,问题不是为什么它不编译这两者之间的区别是什么导致第一个编译而第二个不编译?。

Cha*_*man 16

第一种情况是编译器中的特殊情况:当某些类型需要统一时(例如当所有类型都是同一个数组的元素时),并且所有类型都是非捕获闭包时,编译器会自动将它们强制转换为函数指针。但是,如果它们是包含非捕获闭包的元组,则这不起作用。

如果你有兴趣的话,rustc 中的相关代码在这里。