types - 使用相同的 Rust channel (mpsc) 发送不同的类型

标签 types rust channels

我有这样一种情况,我正在设置具有多个发送器的 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/

相关文章:

Golang 超时不与 channel 一起执行

java - 通过 ReadableByteChannel 的 InputStream 没有读到结束

java - 为什么原始类型不能强制转换?

types - OCaml 的 "ground coercion"是什么?

rust - 什么是 crate 属性,我应该在哪里添加它?

rust - 如何处理未知类型

rust - 如何向编译器解释 T 以返回相同类型的方式实现 Add?

administrator - 如何在 Telegram 中找到我拥有的 channel ?

c++ - 从基类调用派生类的函数模板

java - 泛型 - 动态创建数据