我有这样一种情况,我正在设置具有多个发送器的 channel ,这些发送器需要能够将不同类型的数据发送到接收线程。
使用以下匹配表达式创建一个接收线程来处理这些消息。
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>
.
看看我的匹配表达式,我认为创建一个更通用的函数来初始化我的接收线程更明智,但是我如何通过同一 channel 发送不同类型的数据?我搜索并找到了一个可能的解决方案,方法是使用一个将我的结构和一个字符串作为字段的枚举,但这是否意味着我必须更改所有函数定义才能使用此枚举语法? IE。更改我的功能以使用 ChannelTypes(StringMessage(String))
或 ChannelTypes(StructMessage(factory::datatype::MyStruct))
enum ChannelTypes {
StructMessage(factory::datatype::MyStruct),
StringMessage(String),
}
最佳答案
一个特定的 channel 只能发送一种类型的数据。正如您所注意到的,您的发件人的类型为 Sender<String>
接收者的类型是 Receiver<String>
.所以两者都固定在 String
.没有办法解决这个问题(有充分的理由!)
首选的解决方案实际上是使用枚举,是的。事实上,您尝试模拟枚举会为您做什么:您有一个标签,它描述了预期的数据类型。在您的尝试中,您使用字符串作为标签。但出于多种原因,这是一个坏主意。当您使用枚举时,会使用整数标签(更好),Rust 会为您处理它们。更强大的解决方案。
一个建议:您可能会发现将枚举类型视为消息更有用。就是这样:您将消息发送到另一个线程。此消息可能是许多不同类型中的一种。接收线程必须检查到达的是哪种消息,然后才能处理它。
关于types - 使用相同的 Rust channel (mpsc) 发送不同的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58615697/