gpt4 book ai didi

pipe - 将采用 Write 的函数连接到采用 Read 的函数

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

我正在探索 Iron web framework for Rust并创建了一个小型处理程序,它将读取从请求 URL 派生的图像,调整其大小,然后传递结果。据我所知 Iron Response可以从几种不同的类型构建,包括实现 Read trait 的类型.

save functionimage crate采用实现 Write trait 的类型.

感觉这两个函数应该能够连接起来,这样写者就可以写入一个缓冲区,而读者可以从中读取。我找到了 pipe crate ,它似乎实现了这种行为,但我无法将管道的 Read 端转换为 Iron 将接受的内容。

我的函数的一个稍微简化的版本:

fn artwork(req: &mut Request) -> IronResult<Response> {
let mut filepath = PathBuf::from("artwork/sample.png");

let img = match image::open(&filepath) {
Ok(img) => img,
Err(e) => return Err(IronError::new(e, status::InternalServerError))
};

let (mut read, mut write) = pipe::pipe();

thread::spawn(move || {
let thumb = img.resize(128, 128, image::FilterType::Triangle);
thumb.save(&mut write, image::JPEG).unwrap();
});

let mut res = Response::new();
res.status = Some(iron::status::Ok);
res.body = Some(Box::new(read));

Ok(res)
}

我收到的错误:

src/main.rs:70:21: 70:35 error: the trait `iron::response::WriteBody` is not implemented for the type `pipe::PipeReader` [E0277]
src/main.rs:70 res.body = Some(Box::new(read));
^~~~~~~~~~~~~~

PipeReader实现 ReadWriteBody是为 Read 实现的,所以我觉得这应该可行。我也试过:

let reader: Box<Read> = Box::new(read);

let mut res = Response::new();
res.status = Some(iron::status::Ok);
res.body = Some(reader);

但这给出了错误:

src/main.rs:72:21: 72:27 error: mismatched types:
expected `Box<iron::response::WriteBody + Send>`,
found `Box<std::io::Read>`
(expected trait `iron::response::WriteBody`,
found trait `std::io::Read`) [E0308]
src/main.rs:72 res.body = Some(reader);
^~~~~~

如何将 save 函数连接到 Iron 响应主体?

最佳答案

您不能使用 impl对于 Box<Read>在这里,因为 Rust 不能保证它实现了 Send .如果你有一个 Box<Read + Send> ,但事实就是如此。不幸的是,虽然 Box<Read>工具 WriteBody , Box<Read + Send>没有,所以你不能使用这种类型。

查看 WriteBody 的源代码及其实现,有a commented out implementation这将实现 WriteBody对于所有实现 Read 的类型, 但它现在还不能编译(正如评论所说,这需要专门化,希望很快就会出现在该语言中)。

您可以向 Iron 提交拉取请求以添加 impl对于 WriteBodyBox<Read + Send> ;然后,您可以使用该类型 ( demo )。另一种选择是为 PipeReader 定义一个包装结构。并实现 WriteBody你自己(可能基于 the implementation for Box<Read> )。

关于pipe - 将采用 Write 的函数连接到采用 Read 的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32676277/

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