gpt4 book ai didi

rust - 根据条件如何将输出分配给变量匹配类型

转载 作者:行者123 更新时间:2023-12-03 11:45:01 26 4
gpt4 key购买 nike

我想修改一个上传异步文件的库,以便它可以在什么迭代中“公开”或“通知”,我的目标是防止直接从库中“打印/写入”,而是从可以使用该库,以便通过使用“公开的”数据,他们可以做一些事情。我用于在每次交互中测试任务的代码是:

use futures::stream::TryStreamExt;
use tokio_util::codec::{BytesCodec, FramedRead};

let stream = FramedRead::new(file, BytesCodec::new())
.inspect_ok(|chunk| {
// do X with chunk...
});

// reqwest
let body = Body::wrap_stream(stream);
client.put(url).body(body)
我正在考虑使用一个 channel 来“共享状态”(如果可以用这种方式调用),这样,如果我收到 Sender作为参数,则可以对其进行写操作,并从进行调用的方法中使用 Receiver做某事(例如显示进度栏),这就是我正在尝试的:
use tokio::sync::mpsc; 

fn upload(file: String, sender: Option<mpsc::Sender<usize>) {
let stream = if let Some(mut tx) = sender {
FramedRead::new(file, BytesCodec::new()).inspect_ok(move |chunk|
tx.send(chunk.len())
)
} else {
FramedRead::new(file, BytesCodec::new())
};

// reqwest
let body = Body::wrap_stream(stream);
client.put(url).body(body)
let body = Body::wrap_stream(stream);
}
我得到的错误是:
`if` and `else` have incompatible types
我也尝试过:
let stream = FramedRead::new(file, BytesCodec::new());

if let Some(mut tx) = sender {
stream.inspect_ok(move |chunk|
tx.send(chunk.len())
);
}
但是获取 mismatched types如何实现呢?有没有更好的 channel 方法?
例如,我想使用 crate indicatif这样的东西:
use tokio::sync::mpsc;
use indicatif::ProgressBar;
use mylibrary::upload;

let (mut tx, mut rx) = mpsc::channel(100);

let bar = ProgressBar::new(1000);

// here pass the sender so that in the receiver i could increment the progress bar
let response = upload("file", Some(tx));

while let Some(i) = rx.recv().await {
bar.inc(1);
}

bar.finish();

最佳答案

生成if中的主体,以便两个 ARM 都键入Body:

use tokio::sync::mpsc;

fn upload(file: String, sender: Option<mpsc::Sender<usize>) {
let stream = FramedRead::new(file, BytesCodec::new());

let body = if let Some(mut tx) = sender {
Body::wrap_stream(stream
.inspect_ok(move |chunk| tx.send(chunk.len()))
)
} else {
Body::wrap_stream(stream)
};

// not sure where `client` or `url` are defined?
client.put(url).body(body)
}
或者,按照 @SvenMarnach's suggestion:
use tokio::sync::mpsc;
use futures::future::Either;

fn upload(file: String, sender: Option<mpsc::Sender<usize>) {
let stream = FramedRead::new(file, BytesCodec::new());

let stream = if let Some(mut tx) = sender {
Either::Left(stream
.inspect_ok(move |chunk| tx.send(chunk.len()))
)
} else {
Either::Right(stream)
};

let body = Body::wrap_stream(stream);

// not sure where `client` or `url` are defined?
client.put(url).body(body)
}

关于rust - 根据条件如何将输出分配给变量匹配类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63374041/

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