Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 闭包向量的推断类型是什么?_Rust - Fatal编程技术网

Rust 闭包向量的推断类型是什么?

Rust 闭包向量的推断类型是什么?,rust,Rust,我尝试创建闭包向量: fn main() { let mut vec = Vec::new(); vec.push(Box::new(|| 10)); vec.push(Box::new(|| 20)); println!("{}", vec[0]()); println!("{}", vec[1]()); } 这将生成以下错误报告: 错误[E0308]:类型不匹配 -->src/main.rs:5:23 | 5 |矢量推送(框:新(| 20));

我尝试创建闭包向量:

fn main() {
    let mut vec = Vec::new();

    vec.push(Box::new(|| 10));
    vec.push(Box::new(|| 20));

    println!("{}", vec[0]());
    println!("{}", vec[1]());
}
这将生成以下错误报告:

错误[E0308]:类型不匹配
-->src/main.rs:5:23
|
5 |矢量推送(框:新(| 20));
|^^^^预期的闭包,找到了其他闭包
|
=注:预期类型`[closure@src/main.rs:4:23:4:28]`
找到类型`[closure@src/main.rs:5:23:5:28]`
=注:没有两个闭包(即使相同)具有相同的类型
=帮助:考虑装箱关闭和/或使用它作为特征对象
我通过显式指定类型修复了它:

let mut vec: Vec<Box<Fn() -> i32>> = Vec::new();
让mut-vec:vec>=vec::new();

vec的推断类型是什么?为什么是这样?

每个闭包都有一个自动生成的、唯一的匿名类型。将第一个闭包添加到向量后,即向量中所有项的类型。但是,当您尝试添加第二个闭包时,它有一个不同的自动生成的、唯一的匿名类型,因此会列出错误

闭包本质上是
struct
s,由实现
Fn*
特征之一的编译器创建。
struct
包含闭包捕获的所有变量的字段,因此根据定义,它需要是唯一的,因为每个闭包将捕获不同数量和类型的变量

为什么它不能推断出
框i32>

“不能”是一个很难回答的问题。编译器可能会迭代每种类型的所有特性,以查看是否有交集导致代码编译,但这让我觉得有点不可思议。你可以尝试打开一个功能请求,或者在论坛上讨论它,看看这样的想法是否被普遍接受

然而,Rust确实试图让事情变得明确,尤其是那些可能涉及性能的事情。当你从一个具体的结构到一个trait对象时,你引入了间接性,它可能会变慢

现在,
Fn*
特征的工作原理与用户构建的特征相同:

trait MyTrait {
    fn hello(&self) {}
}

struct MyStruct1;
impl MyTrait for MyStruct1 {}

struct MyStruct2;
impl MyTrait for MyStruct2 {}

fn main() {
    let mut things = vec![];
    things.push(MyStruct1);
    things.push(MyStruct2);
}
错误[E0308]:类型不匹配
-->src/main.rs:14:17
|
14 |事物推动(MyStruct2);
|^^^^^^^^应为结构'MyStruct1',找到结构'MyStruct2'`
|
=注意:应为'MyStruct1'类型`
找到类型`MyStruct2`

为什么不能推断出框i32>?结果是每个函数都有自己独特的类型我很好奇做出这个决定的原因是什么。@VRW这就是我第一句话的意思:“每个闭包都有一个自动生成的、唯一的、匿名的类型。”你对我如何更好地表达它有什么建议吗?你的意思是Rust中的每个函数都是一个闭包吗?那不清楚。@VRW啊,我现在明白区别了。函数和闭包都具有自动生成的唯一匿名类型。但是,因为您的问题是关于闭包的,所以我只提到它适用于闭包。函数也有唯一类型的决定是在一个单独的时间点做出的(最近,IIRC)。