gpt4 book ai didi

generics - RuSTLang 使用 channel 发送通用数据?必须实现哪些特征/标记才能做到这一点?

转载 作者:行者123 更新时间:2023-11-29 08:31:03 25 4
gpt4 key购买 nike

必须在通用类型 T 上实现哪些特征和标记才能通过 channel 发送?类型 T 不应包含任何引用,并拥有其所有来自任何引用的“纯”内容(因此保证仅由其范围拥有)。 T 的所有嵌套字段也是如此。这样就不需要生命周期说明符来转移所有权。 i32 实现了哪些特征,我的泛型类型 T 没有实现以防止错误 fn 编译?

fn error<T: Send+Sized>(mut data: Vec<T>)->Receiver<T>{
let (s, r) = channel();
std::thread::spawn(move ||{
while let Some(nextthing) = data.pop(){
s.send(nextthing);
}
});
r
}

相对于

fn thisworks(mut data: Vec<i32>)->Receiver<i32>{
let (s, r) = channel();
std::thread::spawn(move ||{
while let Some(nextthing) = data.pop(){
s.send(nextthing);
}
});
r
}

错误:我只是希望它像 i32 一样工作:所有权在整个生命周期内毫无疑问地干净地转移(可能与 Primitive 类型和 i32 的复制特征有关?)

rror[E0310]: the parameter type `T` may not live long enough
--> src/main.rs:7:5
|
5 | fn error<T: Send+Sized>(mut data: Vec<T>)->Receiver<T>{
| -- help: consider adding an explicit lifetime bound `T: 'static`...
6 | let (s, r) = channel();
7 | std::thread::spawn(move ||{
| ^^^^^^^^^^^^^^^^^^
|
note: ...so that the type `[closure@src/main.rs:7:24: 11:6 data:std::vec::Vec<T>, s:std::sync::mpsc::Sender<T>]` will meet its required lifetime bounds
--> src/main.rs:7:5
|
7 | std::thread::spawn(move ||{
| ^^^^^^^^^^^^^^^^^^

error: aborting due to previous error

For more information about this error, try `rustc --explain E0310`.
error: Could not compile `playground`.

Playground 链接是 https://play.rust-lang.org/?version=nightly&mode=release&edition=2018&gist=117113384490f15bb33ff8f749661769

最佳答案

这与类型无关,与类型的生命周期有关。

编译器错误是正确的。您唯一需要的更改是这一行:

fn error<T: Send+Sized+'static>(mut data: Vec<T>)->Receiver<T>{

'static 的添加是一个额外的要求,即类型不能是短暂的;也就是说,它必须在程序的生命周期内定义。这并不意味着对象自身 必须具有'static 生命周期,只是类型。

关于generics - RuSTLang 使用 channel 发送通用数据?必须实现哪些特征/标记才能做到这一点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57812234/

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