为什么 rustc 说推断的类型不匹配?

Why does rustc say the inferred types mismatched?

如果我尝试创建一个函数指针向量,编译器总是抱怨类型错误(尽管我没有明确声明任何类型):

fn abc() {}

fn def() {}

fn main()
{
    let a = vec![abc, def];
}

https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=ef52fe778db1112433d20dd02b3d0b54

error[E0308]: mismatched types
 --> src/main.rs:5:13
  |
5 |     let a = vec![abc, def];
  |             ^^^^^^^^^^^^^^ expected slice, found array of 2 elements
  |
  = note: expected struct `Box<[fn() {abc}], _>`
             found struct `Box<[fn(); 2], std::alloc::Global>`
  = note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)

error: aborting due to previous error

For more information about this error, try `rustc --explain E0308`.
error: could not compile `tes`

To learn more, run the command again with --verbose.

这两个函数具有不同的类型,您应该能够显式 Box 它们并转换为 Box<dyn Fn()>

fn abc() {}
fn def() {}
fn main()
{
    let a = vec![Box::new(abc) as Box<dyn Fn()>, Box::new(def) as Box<dyn Fn()>];
}

我相信 Rust 试图为函数提供唯一类型,所以只需指定它是一个函数指针 Vec。这也避免了 Box<dyn Fn()>:

的额外间接和分配
fn abc() {}
fn def() {}

fn main() {
    let a: Vec<fn()> = vec![abc, def];
}

或者,“投”第一个,其余的可以推断:

fn abc() {}
fn def() {}

fn main() {
    let a = vec![abc as fn(), def];
}