Rust 如何通过接收器发送项目列表?

Rust 如何通过接收器发送项目列表?,rust,future,Rust,Future,我有一个通过期货发送的项目列表::Sink: let mut list = VecDeque::new(); /* add a bunch of Packet items to list */ let (sink, stream) = tcp_stream.framed(PacketCodec).split(); 我可以用电子邮件发送一个包裹 if let Some(first) = list.pop_front() { sink.send(first); } 如何发送整个列表?当使

我有一个通过期货发送的项目列表::
Sink

let mut list = VecDeque::new();
/* add a bunch of Packet items to list */
let (sink, stream) = tcp_stream.framed(PacketCodec).split();
我可以用电子邮件发送一个包裹

if let Some(first) = list.pop_front() {
    sink.send(first);
}

如何发送整个列表?

当使用新软件时,我发现在深入研究之前阅读文档非常有用。一般来说,锈菌群落提供了大量的资源

例如,Tokio项目有一个。这一点在这里也是无价的

我建议所有程序员学习的另一件事是创建一个问题的解决方案。这使他们能够专注于问题的核心,同时也消除了问题背后的陈词滥调。这里有一个例子:

use futures::{Sink, SinkExt}; // 0.3.4

fn thing(mut sink: impl Sink<i32>) {
    let mut all_the_things = vec![1, 2, 3, 4, 5];

    while let Some(v) = all_the_things.pop() {
        sink.send(v);
    }
}
从这里,我们可以看到,
send
要求类型实现
Unpin
,因此让我们更改一下:

use futures::{Sink, SinkExt}; // 0.3.4
use std::marker::Unpin;

fn thing(mut sink: impl Sink<i32> + Unpin) {
    let mut all_the_things = vec![1, 2, 3, 4, 5];

    while let Some(v) = all_the_things.pop() {
        sink.send(v);
    }
}
再次查看API,我们看到它返回一个值。这很奇怪,不是吗?这其实并不奇怪,一旦你看到
Send
实现了
Future
——如果流已经满了,将某些东西推到流中可能会阻塞;这就是背压的概念。将结果设置为未来,这样您就可以知道项目何时实际添加到流中

一种解决方案是通过
.wait
和编写函数
async
,来推动未来的发展:

use futures::{Sink, SinkExt}; // 0.3.4
use std::marker::Unpin;

async fn thing(mut sink: impl Sink<i32> + Unpin) {
    let mut all_the_things = vec![1, 2, 3, 4, 5];

    while let Some(v) = all_the_things.pop() {
        sink.send(v)
            .await
            .unwrap_or_else(|_| panic!("Unable to send item"));
    }
}

“以下显然不起作用”-怎么会这样?您能否包括错误,或描述您看到的行为?在询问堆栈溢出问题时,请生成一个。我打赌丢失的错误消息表示预期的
T
,发现的
&T
。如果是这样的话,我强烈建议你回去重读一遍,因为这对Tokio来说不是问题,而是基本的锈迹所有权。对不起,我添加的代码在概念上无法表达我想要的东西,但由于很多原因,包括所有权和寿命问题,它无法工作。我发现这是一种干扰,而不是概念上的说明,所以我将删除它。答案很好!他也是一个神奇的指针。它肯定需要在谷歌进行升级。我一直在使用这些资料、文档和一些博客来了解tokio。我相信谷歌的排名会稳步攀升;东京0.1毕竟是两周前才发布的!谢谢你的详细回答。这让我感到有些意外,关于为什么你会故意设计一个API来利用Rust的移动语义。@PeterHall太棒了!我不是100%确定,但我认为在这种情况下,移动语义也有助于期货的“零额外成本”方面。
use futures::{Sink, SinkExt}; // 0.3.4
use std::marker::Unpin;

async fn thing(mut sink: impl Sink<i32> + Unpin) {
    let mut all_the_things = vec![1, 2, 3, 4, 5];

    while let Some(v) = all_the_things.pop() {
        sink.send(v)
            .await
            .unwrap_or_else(|_| panic!("Unable to send item"));
    }
}
use futures::{stream, Sink, SinkExt}; // 0.3.4
use std::marker::Unpin;

async fn thing(mut sink: impl Sink<i32> + Unpin) {
    let all_the_things = vec![1, 2, 3, 4, 5];
    let mut stream = stream::iter(all_the_things.into_iter().map(Ok));

    sink.send_all(&mut stream)
        .await
        .unwrap_or_else(|_| panic!("Unable to send item"));
}