使用相同的Rust频道(mpsc)发送不同的类型

问题描述 投票:0回答:1

我遇到了这样的情况,我正在与多个发送者建立通道,这些发送者需要能够将不同类型的数据发送到接收线程。

创建接收线程以使用以下匹配表达式来处理这些消息。

let receiver_thread = match config.style.as_str() {
    "Type1" => start_recv_type1(receiver, config.clone(), log.clone()),
    "Type2" => start_recv_type2(receiver, config.clone(), log.clone()),
    "Type3" => start_recv_type3(receiver, log.clone()),
    _ => panic!("Wrong type!"),
};

可以发送的一种可能的类型是字符串,而另一种是我定义的结构。但是,编译器抱怨接收线程上的类型不匹配。查看我的接收方和发送方的定义,我可以看到为什么它不正确,因为它具有以下类型:std::sync::mpsc::Receiver<std::string::String>

看着我的match表达式,我认为创建一个更通用的函数来初始化我的接收线程比较明智,但是如何在同一通道上发送不同类型的数据呢?我已经通过使用将结构和字符串作为字段的枚举进行搜索并找到了可能的解决方案,但这是否意味着我必须更改所有函数定义才能使用此枚举语法?即更改我的功能以使用ChannelTypes(StringMessage(String))ChannelTypes(StructMessage(factory::datatype::MyStruct))

enum ChannelTypes {
    StructMessage(factory::datatype::MyStruct),
    StringMessage(String),
}
types rust channels
1个回答
0
投票

一个特定的通道只能发送一种类型的数据。如您所见,发送者的类型为Sender<String>,接收者的类型为Receiver<String>。因此,两者都固定在String上。无法解决此问题(有充分的理由!)

首选解决方案实际上是使用枚举,是的。实际上,您尝试模仿枚举对您的影响:您有一个tag描述了期望的数据类型。在尝试使用字符串作为标记时。但这是一个坏主意,原因有很多。当使用枚举时,将使用整数标签(更好),Rust会为您处理它们。更健壮的解决方案。

一个建议:将枚举类型视为消息可能会更有用。就是这样:您将消息发送到另一个线程。该消息可能是许多不同类型中的一种。接收线程必须检查哪种消息已到达,然后可以对其进行处理。

© www.soinside.com 2019 - 2024. All rights reserved.