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

Types 为什么rustc说推断的类型不匹配?,types,rust,typeerror,type-inference,Types,Rust,Typeerror,Type Inference,如果我尝试创建函数指针的向量,编译器总是抱怨错误的类型(尽管我没有显式声明任何类型): fn abc(){} fn def(){} fn main() { 设a=vec![abc,def]; } 错误[E0308]:类型不匹配 -->src/main.rs:5:13 | 5 |让a=vec![abc,def]; |^^^^^^^^^^^^^^^^^^^^^应为片,找到2个元素的数组 | =注意:应为struct`Box` 找到结构框` =注意:此错误源于宏(在夜间构建中,使用-Z宏反向跟踪运

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

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

错误[E0308]:类型不匹配
-->src/main.rs:5:13
|
5 |让a=vec![abc,def];
|^^^^^^^^^^^^^^^^^^^^^应为片,找到2个元素的数组
|
=注意:应为struct`Box`
找到结构框`
=注意:此错误源于宏(在夜间构建中,使用-Z宏反向跟踪运行以获取更多信息)
错误:由于上一个错误而中止
有关此错误的详细信息,请尝试“rustc--explain E0308”。
错误:无法编译'tes'`
要了解更多信息,请使用--verbose再次运行该命令。

这两个函数有不同的类型,您应该能够显式地
Box
它们并强制转换到
Box

fn abc(){}
fn def(){}
fn main()
{
设a=vec![Box::new(abc)as Box,Box::new(def)as Box];
}

这两个函数有不同的类型,您应该能够显式地
Box
它们并强制转换到
Box

fn abc(){}
fn def(){}
fn main()
{
设a=vec![Box::new(abc)as Box,Box::new(def)as Box];
}

我认为Rust试图为函数提供唯一的类型,所以只需指定它是一个函数指针Vec。这也避免了额外的间接寻址和分配

fn abc(){}
fn def(){}
fn main(){
设a:Vec=Vec![abc,def];
}
或者,可以推断“铸造”第一个和其余部分:

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

我认为Rust试图为函数提供唯一的类型,所以只需指定它是一个函数指针Vec。这也避免了额外的间接寻址和分配

fn abc(){}
fn def(){}
fn main(){
设a:Vec=Vec![abc,def];
}
或者,可以推断“铸造”第一个和其余部分:

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

Minor correction:它避免了额外的分配,但仍有一定程度的间接性(“函数指针”的“指针”部分)。尽管可以说,它仍然不是间接的,因为您不必同时遵循vtable指针和函数指针。小更正:它避免了额外的分配,但仍然具有一定程度的间接性(“函数指针”的“指针”部分)。尽管可以说它仍然不是间接的,因为您不必同时遵循vtable指针和函数指针。
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.
fn abc() {}
fn def() {}
fn main()
{
    let a = vec![Box::new(abc) as Box<dyn Fn()>, Box::new(def) as Box<dyn Fn()>];
}