首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将通道接收器类型从Receiver<T>更改为Receiver<U>

将通道接收器类型从Receiver<T>更改为Receiver<U>
EN

Stack Overflow用户
提问于 2021-04-14 14:03:24
回答 1查看 45关注 0票数 0

我有一个接口,它定义了一个返回接收器的方法:

代码语言:javascript
复制
pub fn subscribe(to: &str) -> crossbeam_channel::Receiver<Message>;

我使用的是一个库方法,它返回一个接收者,但消息类型不同:

代码语言:javascript
复制
pub fn subscribe(to: &str) -> crossbeam_channel::Receiver<lib::Message>;

lib::Message转换为Message很容易,但是我如何实现接口,它将充当这个库的包装器,这样返回的类型就是正确的?

我尝试创建一个新通道,但这不起作用,(我认为)因为该方法将返回,然后不再向新通道传递消息,因此receiver将始终为空。

代码语言:javascript
复制
let sub_recv = subscription.receiver();
let (send, receiver) = crossbeam_channel::unbounded::<Message>();
for m in sub_recv.try_recv() {
    send.send(m.into()).map_err(|_| MQError::ConversionError)?;
}

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-15 18:50:36

要在你的类型之间转换,你应该运行后台任务来做,因为否则你会阻塞你试图这样做的线程。

Playground link

代码语言:javascript
复制
use crossbeam_channel::{Receiver, unbounded}; // 0.5.0

trait ReceiverCompatExt<T>
{
    fn convert(self) -> Receiver<T>;
}

impl<T, U> ReceiverCompatExt<U> for Receiver<T>
    where U: From<T>,
          T: Send + 'static,
          U: Send + 'static,
{
    fn convert(self) -> Receiver<U> {
        let (sender, receiver) = unbounded();
        
        std::thread::spawn(move || {
            while let Ok(value) = self.recv() {
                if sender.send(value.into()).is_err() {
                    break;
                }
            }
        });
        
        receiver
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67086293

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档