Rust 对于可克隆对象,我需要哪些缺少的功能和特性?

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

我第一次用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; 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()
。请确保您提供的代码生成您所询问的错误