将频道接收器类型从 Receiver<T> 更改为 Receiver<U>
Change a channel receiver type from Receiver<T> to Receiver<U>
我有一个接口,它定义了一个return接收者的方法:
pub fn subscribe(to: &str) -> crossbeam_channel::Receiver<Message>;
我正在使用一个 return 是接收者的库方法,但消息类型不同:
pub fn subscribe(to: &str) -> crossbeam_channel::Receiver<lib::Message>;
将 lib::Message
转换为 Message
很容易,但是我如何实现接口,它可以作为这个库的包装器,这样类型 returned正确吗?
我尝试创建一个新频道,但这不起作用,(我认为)因为该方法将 return 然后不再将消息传递到新频道,因此 receiver
将永远为空。
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)?;
}
谢谢
要在您的类型之间进行转换,您应该 运行 后台任务来执行此操作,因为否则您会阻塞您尝试执行此操作的线程。
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
}
}
我有一个接口,它定义了一个return接收者的方法:
pub fn subscribe(to: &str) -> crossbeam_channel::Receiver<Message>;
我正在使用一个 return 是接收者的库方法,但消息类型不同:
pub fn subscribe(to: &str) -> crossbeam_channel::Receiver<lib::Message>;
将 lib::Message
转换为 Message
很容易,但是我如何实现接口,它可以作为这个库的包装器,这样类型 returned正确吗?
我尝试创建一个新频道,但这不起作用,(我认为)因为该方法将 return 然后不再将消息传递到新频道,因此 receiver
将永远为空。
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)?;
}
谢谢
要在您的类型之间进行转换,您应该 运行 后台任务来执行此操作,因为否则您会阻塞您尝试执行此操作的线程。
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
}
}