Rust 对于可克隆对象,我需要哪些缺少的功能和特性?
我第一次用futures 0.3做实验,并得到了特质或终身问题Rust 对于可克隆对象,我需要哪些缺少的功能和特性?,rust,future,Rust,Future,我第一次用futures 0.3做实验,并得到了特质或终身问题 use futures::executor::ThreadPool; use futures::future::*; use futures::StreamExt; const BUFSIZE: usize = 140; #[derive(Clone)] struct Packet { channel: usize, seq: usize, total: usize, buffer: [u8; B
use futures::executor::ThreadPool;
use futures::future::*;
use futures::StreamExt;
const BUFSIZE: usize = 140;
#[derive(Clone)]
struct Packet {
channel: usize,
seq: usize,
total: usize,
buffer: [u8; BUFSIZE],
}
fn to_packets<T>(channel: usize, msg: T) -> Vec<Packet> {
// Trivial implemmentation
vec![Packet {
channel: 0,
seq: 0,
total: 0,
buffer: [0u8; BUFSIZE],
}]
}
pub struct SMConnection;
impl SMConnection {
fn push<T: 'static>(&mut self, channel: &'static usize, msg: T)
where
T: Send + Sync + Clone + Serialize,
{
let threadpool = ThreadPool::new().unwrap();
let future = async {
move || {
to_packets(*channel, msg)
.iter()
.for_each(|_packet| { /* do something */ })
};
};
threadpool.spawn_ok(future);
}
}
我正在按值传递频道
和消息
,因此我不希望出现终身问题。按照编译器的建议为参数提供”静态
边界仍然让我陷入困境
我尝试了clone
和Arc
我错过了什么
编辑以供参考:Cargo.toml
[dependencies]
serde="^1"
serde_derive="^1"
bincode = "1.1.4"
romio = "0.3.0-alpha.9"
futures-preview = { version = "=0.3.0-alpha.18", features = ["async-await", "nightly"] }
编译器:rustc 1.39.0-每晚(9b91b9c10 2019-08-26)在玩过它并专门阅读之后,我意识到,如果您1)将值移动到异步未来,2)将值包装成圆弧,并使用引用计数包装器后面的值,那么您可以保持接口不变,并屏蔽用户
fn push<T: 'static>(&mut self, channel: usize, msg: T)
where
T: Send + Sync + Clone + Serialize,
{
let threadpool = ThreadPool::new().unwrap();
let future = async move {
let msg = Arc::from(msg);
let channel = Arc::from(channel);
move || to_packets(*channel, msg).iter().for_each(|_| {});
};
threadpool.spawn_ok(future);
}
fn push在玩过它并特别阅读之后,我意识到,如果1)将值移动到异步未来,2)将值包装成圆弧,并使用引用计数包装器后面的值,则可以保持界面不变并屏蔽用户
fn push<T: 'static>(&mut self, channel: usize, msg: T)
where
T: Send + Sync + Clone + Serialize,
{
let threadpool = ThreadPool::new().unwrap();
let future = async move {
let msg = Arc::from(msg);
let channel = Arc::from(channel);
move || to_packets(*channel, msg).iter().for_each(|_| {});
};
threadpool.spawn_ok(future);
}
fn很难回答您的问题,因为它没有包含一个。我们无法说出代码中存在哪些板条箱(及其版本)、类型、特征、字段等。如果您试图重现您的错误(如果可能的话),或者在全新的货运项目中,那么我们将更容易帮助您,然后您的问题将包括附加信息。您可以使用以下方法减少在此处发布的原始代码。谢谢具体来说,有一个未定义的类型/特征序列化;我们不知道您使用的是哪一个版本的板条箱(目前还没有发布0.3版本),并且包含nightly Rust编译器的版本非常重要。示例中还有不需要的代码。这感觉就像;;;,的副本,等等。您的错误消息引用了问题中不存在的代码:channel.clone()
。请确保您提供的代码生成了您所询问的错误。例如,您的问题很难回答,因为它没有包含错误。我们无法说出代码中存在哪些板条箱(及其版本)、类型、特征、字段等。如果您试图重现您的错误(如果可能的话),或者在全新的货运项目中,那么我们将更容易帮助您,然后您的问题将包括附加信息。您可以使用以下方法减少在此处发布的原始代码。谢谢具体来说,有一个未定义的类型/特征序列化;我们不知道您使用的是哪一个版本的板条箱(目前还没有发布0.3版本),并且包含nightly Rust编译器的版本非常重要。示例中还有不需要的代码。这感觉就像;;;,的副本,等等。您的错误消息引用了问题中不存在的代码:channel.clone()
。请确保您提供的代码生成您所询问的错误