Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Types 使用同一生锈通道(mpsc)发送不同类型_Types_Rust_Channels - Fatal编程技术网

Types 使用同一生锈通道(mpsc)发送不同类型

Types 使用同一生锈通道(mpsc)发送不同类型,types,rust,channels,Types,Rust,Channels,我遇到了这样一种情况:我正在设置多个发送者的通道,这些发送者需要能够向接收线程发送不同类型的数据 将创建一个接收线程,以使用以下匹配表达式处理这些消息 let receiver_thread = match config.style.as_str() { "Type1" => start_recv_type1(receiver, config.clone(), log.clone()), "Type2" => start_recv_type2(receiver, co

我遇到了这样一种情况:我正在设置多个发送者的通道,这些发送者需要能够向接收线程发送不同类型的数据

将创建一个接收线程,以使用以下匹配表达式处理这些消息

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

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


一个特定频道只能发送一种类型的数据。正如您所注意到的,您的发送方具有类型
发送方
,接收方具有类型
接收方
。因此,两者都固定在
字符串上。这是没有办法的(有充分的理由!)

首选解决方案实际上是使用枚举,是的。事实上,您试图模拟枚举为您所做的工作:您有一个标记,用于描述预期的数据类型。尝试使用字符串作为标记。但这是个坏主意,原因很多。使用枚举时,会使用整数标记(更好),Rust会为您处理它们。更健壮的解决方案


一个建议:您可能会发现将枚举类型视为消息更有用。这就是问题所在:您向另一个线程发送消息。这个消息可能是许多不同类型的消息之一。接收线程必须检查到达的消息类型,然后才能处理它

以下是enum的一个示例:

use std::sync::mpsc::{self, Receiver, Sender};

enum Fruit {
    Apple(u8),
    Orange(String)
}

fn main() {
    let (tx, rx): (Sender<Fruit>, Receiver<Fruit>) = mpsc::channel();

    tx.send(Fruit::Orange("sweet".to_string())).unwrap();
    tx.send(Fruit::Apple(2)).unwrap();

    for _ in 0..2 {
        match rx.recv().unwrap() {
            Fruit::Apple(count) => println!("received {} apples", count),
            Fruit::Orange(flavor) => println!("received {} oranges", flavor),
        }
    }
}

// output:
// received sweet oranges
// received 2 apples

使用std::sync::mpsc:{self,Receiver,Sender};
罗汉果{
苹果(u8),
橙色(字符串)
}
fn main(){
let(tx,rx):(发送方,接收方)=mpsc::channel();
tx.send(水果::橙色(“甜”).to_string()).unwrap();
tx.send(水果::苹果(2)).unwrap();
对于0..2中的uu{
匹配rx.recv().unwrap()){
水果::苹果(计数)=>println!(“收到{}个苹果”,计数),
水果:橙子(味道)=>println!(“收到的{}橙子”,味道),
}
}
}
//输出:
//我收到了甜橙
//我收到了两个苹果

Enum
如果其变体在内存大小上有相当大的差距,则可能会出现问题。Rust也会为最小变量分配最大的大小。是的,如果大小存在较大差异,则您可以
Box
消息的内容。感谢您的回复,如果我没有弄错,我应该创建一个名为MessageTypes的枚举,并有两个变量名为MessageA和MessageB。每个变量都通过Rust分配给一个整数值,因此每个变量都具有相同的大小。但是,如何在函数中使用我的2个变体?我需要获得这些枚举中的字符串或Vec值。我是否必须在此枚举上使用impl编写一些方法,以便能够与底层数据交互?如果有一个例子就好了。@Vinnie您只需使用
match
在枚举上进行匹配。然后您就可以访问附带的数据。不是懒惰,而是。我希望这有帮助!谢谢,我想得太多了。为了将来的参考,我将我的类型(String、Vec)包装成2个枚举变量。我在接收站点上使用match来打开枚举,在发送端,我正在创建一批数据,并将其包装在MessageType中,如:
pub fn create_batch(timeseries:Vec)->Option
use std::sync::mpsc::{self, Receiver, Sender};

enum Fruit {
    Apple(u8),
    Orange(String)
}

fn main() {
    let (tx, rx): (Sender<Fruit>, Receiver<Fruit>) = mpsc::channel();

    tx.send(Fruit::Orange("sweet".to_string())).unwrap();
    tx.send(Fruit::Apple(2)).unwrap();

    for _ in 0..2 {
        match rx.recv().unwrap() {
            Fruit::Apple(count) => println!("received {} apples", count),
            Fruit::Orange(flavor) => println!("received {} oranges", flavor),
        }
    }
}

// output:
// received sweet oranges
// received 2 apples