gpt4 book ai didi

multithreading - 为什么我不能在横梁范围内生成预定义的闭包

转载 作者:行者123 更新时间:2023-12-03 11:44:53 25 4
gpt4 key购买 nike

为什么会这样:

extern crate crossbeam;
fn main(){
let v: Vec<i32> = vec![1, 2, 3];

crossbeam::scope(|s|{
s.spawn(|_|{
for e in v{
println!("{}", e);
}
});
}).unwrap();
}
当这不符合以下条件时:
extern crate crossbeam;
fn main(){
let v: Vec<i32> = vec![1, 2, 3];
let closure = |_|{
for e in v{
println!("{}", e);
}
};

crossbeam::scope(|s|{
s.spawn(closure);
}).unwrap();
}
与编译器给我的错误:
error[E0308]: mismatched types
--> src/main.rs:11:11
|
11 | s.spawn(closure);
| ^^^^^ one type is more general than the other
|
= note: expected type `std::ops::FnOnce<(&crossbeam::thread::Scope<'_>,)>`
found type `std::ops::FnOnce<(&crossbeam::thread::Scope<'_>,)>`
是因为更高的特质界限吗?
如果是这样,我如何在保持闭包定义在范围之外的同时进行修复?
我是rust的新手,我发现错误令人困惑,因为据我所知,它找到的类型是预期的类型。

最佳答案

问题是rust无法正确推断出封闭的类型(不做详细介绍,假设编译器在封闭之间的类型推断效果不佳)。
在您的情况下,您只需要在所有闭包参数上添加类型注释即可,例如

extern crate crossbeam;
fn main(){
let v: Vec<i32> = vec![1, 2, 3];
let closure = |sr:& crossbeam::thread::Scope<'_> /* anotate the closure arguments types */|{
for e in v{
println!("{}", e);
}
};

crossbeam::scope(|s|{
s.spawn(closure);
}).unwrap();
}
请注意,您的问题类似于 this one

关于multithreading - 为什么我不能在横梁范围内生成预定义的闭包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63427270/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com